找到表中每行具有下一个最接近评级(分数)的行

时间:2014-05-22 11:51:53

标签: sql ms-access detect similarity

我是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

1 个答案:

答案 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条件可确保子查询始终只返回一行。