SQL 查询:根据最新日期获取独特的 id/date 组合 - 需要提高速度
SQL Query: get the unique id/date combos based on latest dates - need speed improvement
不确定如何命名或真正提出这个问题。假设我在连接两个 table 时得到这样的结果集,一个包含 Id
(C),另一个包含 Rating
和 CreatedDate
(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
此外,请理解,虽然这本身就是一个高效的查询,但您的整体性能在很大程度上取决于基础表,尤其是在连接表时使用的索引和解释计划第一名等
不确定如何命名或真正提出这个问题。假设我在连接两个 table 时得到这样的结果集,一个包含 Id
(C),另一个包含 Rating
和 CreatedDate
(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():
的 CTEWITH 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
此外,请理解,虽然这本身就是一个高效的查询,但您的整体性能在很大程度上取决于基础表,尤其是在连接表时使用的索引和解释计划第一名等