SQL 查询:根据最新日期获取独特的 id/date 组合 - 需要提高速度

SQL Query: get the unique id/date combos based on latest dates - need speed improvement

不确定如何命名或真正提出这个问题。假设我在连接两个 table 时得到这样的结果集,一个包含 Id (C),另一个包含 RatingCreatedDate (R ) 外键指向第一个 table:

-----------------------------------
| C.Id | R.Rating | R.CreatedDate |
-----------------------------------
| 2    | 5        | 12/08/1981    |
| 2    | 3        | 01/01/2001    |
| 5    | 1        | 11/11/2011    |
| 5    | 2        | 10/10/2010    |

我想要这个结果集(只有最新的):

-----------------------------------
| C.Id | R.Rating | R.CreatedDate |
-----------------------------------
| 2    | 3        | 01/01/2001    |
| 5    | 1        | 11/11/2011    |

这是一个非常大的数据集,我的方法(我不会提到哪个所以没有偏见)执行此操作非常慢。关于如何获得此套装的任何想法?它不一定必须是单个查询,这是在存储过程中。

谢谢!

您可以使用 row_number():

select t.*
from (select t.*,
             row_number() over (partition by id order by createddate desc) as seqnum
      from table t
     ) t
where seqnum = 1;

您需要具有 ROW_NUMBER():

的 CTE
WITH CTE AS (
SELECT ID, Rating, CreatedDate, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CreatedDate DESC) RowID
FROM [TABLESWITHJOIN]
)
SELECT *
FROM CTE
WHERE RowID = 1;

如果您使用的是 SQL Server 2008 或更高版本,您应该考虑使用窗口函数。例如:

select ID, Rating, CreatedDate from (
    select ID, Rating, CreatedDate, 
        rowseq=ROW_NUMBER() over (partition by ID order by CreatedDate desc)
    from MyTable
) x
where rowseq = 1

此外,请理解,虽然这本身就是一个高效的查询,但您的整体性能在很大程度上取决于基础表,尤其是在连接表时使用的索引和解释计划第一名等