【问题标题】:selfjoin on subquery on then same table performance同一张表上子查询的自连接性能
【发布时间】:2020-08-12 07:46:50
【问题描述】:

我有一个表 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,
                   CAT,
                   GRP,
                   SUB,
                   CO,
                   MAX(Score) AS Score
            FROM T
            GROUP BY ID,CAT,GRP,SUB,CO,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;

有没有更好的方法来编写查询性能?

谢谢你:)

【问题讨论】:

    标签: sql tsql sql-server-2019


    【解决方案1】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多