不确定如何标题或真的问这个。假设我在两个表的连接上得到这样的结果集,一个包含Id
(C),另一个包含Rating
和CreatedDate
(R)带有外键到第一个表:
-----------------------------------
| 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 |
这是一个非常大的数据集,我的方法(我不会提及哪些没有偏见)这样做很慢。有关如何获得此设置的任何想法?它不一定必须是单个查询,这是在存储过程中。
谢谢!
答案 0 :(得分:1)
您可以使用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;
答案 1 :(得分: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;
答案 2 :(得分: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
另外,请理解虽然这本身就是一个有效的查询,但您的整体性能更依赖于底层表,特别是在第一个表中加入表时使用的索引和解释计划地方等。