2015-02-05 36 views
0

不知道如何标题或问这个问题。说我得到这样设置在连接两个表的结果,一个包含Id(C),另一个包含RatingCreatedDate(R)与外键第一个表:SQL查询:根据最新日期获取唯一的ID /日期组合 - 需要提高速度

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

这是一个非常大的数据集,我的方法(我就不提了这所以没有偏差)是这样做很慢。关于如何获得这个集合的任何想法?它不一定是一个单一的查询,这是在一个存储过程。

谢谢!

+2

请用您正在使用的数据库标记您的问题。 – 2015-02-05 16:09:12

回答

1

你需要一个CTE与ROW_NUMBER():

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; 
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

我写了一个答案,但答案弹出之前,我完成了,这里是一个提供数据和您的查询的SQL小提琴:http://sqlfiddle.com/#!6/f0aab/1如果你想使用它 – Tanner 2015-02-05 16:31:17

+0

这些都是正确,谢谢!我的查询删除了30秒! – naspinski 2015-02-05 17:48:30

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 

另外,请大家明白,虽然这是在其本身和高效的查询,您的整体表现更在很大程度上取决于基础表上,尤其是指标,并解释所使用的计划当首先加入表格时,等等。

+0

这些都是正确的,谢谢!我的查询删除了30秒! – naspinski 2015-02-05 17:47:47

相关问题