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

时间:2015-02-05 16:07:38

标签: sql sql-server performance

不确定如何标题或真的问这个。假设我在两个表的连接上得到这样的结果集,一个包含Id(C),另一个包含RatingCreatedDate(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    |

这是一个非常大的数据集,我的方法(我不会提及哪些没有偏见)这样做很慢。有关如何获得此设置的任何想法?它不一定必须是单个查询,这是在存储过程中。

谢谢!

3 个答案:

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

另外,请理解虽然这本身就是一个有效的查询,但您的整体性能更依赖于底层表,特别是在第一个表中加入表时使用的索引和解释计划地方等。