我是SQL的业余用户,我想构建一个非常先进的SQL查询,用于检测Access中数据库中最相似的对象
更确切地说,我的数据库具有以下结构
FID PC1 PC2 PC3 PC4
1 0.765 0.043 -0.0023 -0.0009
5 0.223 -0.09 -0.0045 -0.0002
300
...
...
...
在这个结构中,我想通过考虑所有4个PC属性值(PC1,PC2,PC3,PC4)来检测每个对象(FID)哪个其他(FID)与此最相似。
我可以为这个问题考虑一个数学解决方案,但我不确定如何在SQL查询中实现它。有人可以就此提出建议吗?
提前致谢
~~~~~~~~~~~~~~~~~~~~~~~~~~~
我正在运行的确切查询如下所示:
SELECT
Merged_Info.TARGET_FID,
Merged_Info.PC1_MEAN,
Merged_Info.PC2_Mean,
Merged_Info.PC3_MEAN,
Merged_Info.PC4_MEAN,
([PC1_MEAN]+0.7*[PC2_Mean]+0.4*[PC3_MEAN]+0.2*[PC4_MEAN])/4 AS Rating
FROM Merged_Info
SELECT
q1.TARGET_FID,
(
SELECT TOP 1 q2.TARGET_FID
FROM myRatings AS q2
WHERE q2.TARGET_FID<>q1.TARGET_FID
ORDER BY Abs(q2.Rating-q1.Rating), q2.TARGET_FID
) AS Closest_TARGET_FID
FROM myRatings AS q1
答案 0 :(得分:1)
假设我们在名为[myData]:
的表中有样本数据FID PC1 PC2 PC3 PC4
--- --- --- --- ---
1 1 3 5 2
2 4 4 4 0
3 5 3 1 1
4 9 9 8 7
我们使用一些公式根据[PC1]到[PC4]的值给每一行“评级”(或“得分”)。为简单起见,我们将使用平均值。因此,我们在Access中创建一个名为[myRatings] ...
的已保存查询SELECT
myData.FID,
myData.PC1,
myData.PC2,
myData.PC3,
myData.PC4,
([PC1]+[PC2]+[PC3]+[PC4])/4 AS Rating
FROM myData
...返回......
FID PC1 PC2 PC3 PC4 Rating
--- --- --- --- --- ------
1 1 3 5 2 2.75
2 4 4 4 0 3
3 5 3 1 1 2.5
4 9 9 8 7 8.25
现在我们可以使用该查询作为另一个查询的基础,该查询找到具有最接近评级的FID
SELECT
q1.FID,
(
SELECT TOP 1 q2.FID
FROM myRatings AS q2
WHERE q2.FID<>q1.FID
ORDER BY Abs(q2.Rating-q1.Rating), q2.FID
) AS Closest_FID
FROM myRatings AS q1
返回
FID Closest_FID
--- -----------
1 2
2 1
3 1
4 2
请注意,子查询的ORDER BY子句包含q2.FID作为“tie breaker”。如果没有它,当处理FID = 1的行时,查询将失败,因为FID = 2和FID = 3的评级都与FID = 1的评级相差0.25。在这种情况下,尽管有TOP 1
子句,子查询仍将返回2行。 (这是一个“访问事物”。)添加第二个ORDER BY条件可确保子查询始终只返回一行。