子查询上的selfjoin然后具有相同的表性能

问题描述

我有一个表T(约1.2亿行):

ID  CAT GRP SUB SEQ CO  score
1   04S 72  200 60  047 0
1   04S 72  200 65  047 7
1   04S 72  200 69  050 0
1   04S 72  200 70  050 1
1   04S 72  200 71  050 2
1   04S 72  200 72  050 0
1   04S 72  200 83  053 9
1   04S 72  200 84  053 7
1   04S 72  200 85  053 9
1   04S 72  200 86  053 1

我需要选择score最大的那些记录才能在ID,CAT,GRP,SUB,CO上进行分组。 因此,在这种情况下,结果将是(选择后不应显示括号中的数据):

ID  CAT GRP SUB SEQ (CO score)
1   04S 72  200 65  (047    7)
1   04S 72  200 71  (050    2)
1   04S 72  200 83  (053    9)
1   04S 72  200 85  (053    9)

这是我的查询,但需要花费多个小时才能完成:

SELECT disTINCT
        T.ID,T.CAT,T.GRP,T.SUB,T.SEQ
FROM T
INNER JOIN (
            SELECT
                   ID,CO,MAX(score) AS score
            FROM T
            GROUP BY ID,POS
           ) AS T1
    ON T.ID = T1.ID AND T.CAT = T1.CAT AND T.GRP = T1.GRP AND T.SUB = T1.SUB AND T.CO = T1.CO AND T.score = T1.score;

是否有更好的方式编写性能查询

谢谢:)

解决方法

尝试一下:

SELECT TOP 1 WITH TIES ID,CAT,GRP,SUB,SEQ,CO,Score
FROM data_table
ORDER BY ROW_NUMBER() OVER (PARTITION BY ID,CO ORDER BY Score DESC)