sqlite ORDERBY语句用于对行进行排序并返回与给定输入最相似的行,在对差异进行规范化时返回前5行

cpjpxq1n  于 2023-04-06  发布在  SQLite
关注(0)|答案(1)|浏览(113)

我正在编写一个SQLite语句,试图执行以下步骤:
1.将行过滤为仅与输入邻域匹配的行。
1.通过创建“差异分数”,通过找到归一化/百分比差异并将其乘以每列的预定特征重要性系数来对行进行排序。
1.返回使用此排序方法确定的前5个最相似的行。
我的问题是,我执行这个的方式,它只是通过邻域过滤,然后返回前5行匹配的邻域没有排序。
到目前为止我有:

SELECT * FROM Table
    WHERE NEIGHBORHOOD = :neighborhood
    ORDER BY (( ABS( AREA - :area ) / NULLIF( :area, 0 ) )* 0.12897 + 
    ( ZONING - :zone ) * 0.0023718 +
    (ABS( LOTAREA - :lotArea ) / NULLIF( :lotArea, 0 ))* 0.026922 +
    ( BLDGTYPE - :bldgType ) * 0.000759 + 
    ( HOUSESTYLE - :houseStyle ) * 0.0013082 +
    ( ABS( OVERALLQUAL - :overallQual ) / NULLIF( :overallQual, 0 ) * 0.59289)
LIMIT 5;

我也尝试过使用“CASE WHEN:area = 0 THEN 1 ELSE:area END”来避免输入值为0时导致被0除的错误。我知道(我认为)如果输入值为0,使用NULLIF将忽略该列,而CASE WHEN将把它除以1。我并不太关心如何处理被0除,只要它不会导致错误或导致返回非常不相似的行,我认为这不太可能,因为实际的数据库在相似性计算中有大约30列要使用(这里只显示了几个)。
我还应该提到的是,有些列包含文本,因此这些列不使用ABS函数进行检查。对于这些列,我只是检查它们是否匹配,并将其乘以特征重要性。
对我来说非常奇怪的是,在我试图规范化每列的差异之前,该语句工作,所以没有除法,它返回的属性似乎实际上是按相似性排序的(尽管它们没有规范化,所以在技术上,较大值中的差异被不公平地加权)。
不确定这是否重要,但为了以防万一,我在python中执行这些语句,将输入参数作为字典,并使用以下行:cursor.execute(querysort, input_params )

ev7lccsx

ev7lccsx1#

如果:area = 0,则NULL(:area,0)将返回NULL。
将任何内容除以NULL将返回NULL。但是,将任何内容添加到NULL也将返回NULL。
因此,如果AREA,:area,ZONING,:zone,LOTAREA,:lotArea,BLDGTYPE,:bldgType,HOUSESTYLE,:houseStyle,OVERALLQUAL,:overallQual中的任何一个为NULL(或者如果:area,:lotArea或:overallQual为0),则所有计算的分数都将为NULL。
您可以通过将计算添加到报告的列来检查它:

SELECT (( ABS( AREA - :area ) / NULLIF( :area, 0 ) )* 0.12897 + 
    ( ZONING - :zone ) * 0.0023718 +
    (ABS( LOTAREA - :lotArea ) / NULLIF( :lotArea, 0 ))* 0.026922 +
    ( BLDGTYPE - :bldgType ) * 0.000759 + 
    ( HOUSESTYLE - :houseStyle ) * 0.0013082 +
    ( ABS( OVERALLQUAL - :overallQual ) / NULLIF( :overallQual, 0 ) * 0.59289) as score, * 
    FROM Table
    WHERE NEIGHBORHOOD = :neighborhood
    ORDER BY 1
LIMIT 5;

此外,默认情况下,NULL是先排序的,因此如果您有5行空值,则它们将首先出现,并根据限制进行选择。

ORDER BY 1 NULLS LAST

相关问题