首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取每个ID的最新状态和日期

获取每个ID的最新状态和日期
EN

Stack Overflow用户
提问于 2018-04-07 14:14:38
回答 4查看 379关注 0票数 3

在Server 2008上工作,我一直在为如何查询这个问题而苦苦挣扎。假设我有下表:

代码语言:javascript
复制
ID      Status      Date (YYYY-MM-DD)
A-1     Open        2018-01-01
A-1     Closed      2018-01-05
B-2     Closed      2018-02-01
B-2     Open        2018-02-06
B-2     Closed      2018-02-06
C-3     Closed      2018-03-01
C-3     Open        2018-03-03
C-3     Closed      2018-03-05
C-3     Open        2018-03-07

我希望结果是一个由ID以及与该ID的最新活动相对应的状态和日期组成的表。如果在同一天同时存在打开状态和关闭状态,则应该默认为已关闭状态。因此,使用上表,结果应该是:

代码语言:javascript
复制
ID      Status      Date (YYYY-MM-DD)
A-1     Closed      2018-01-05
B-2     Closed      2018-02-06
C-3     Open        2018-03-07
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-04-07 14:24:01

代码语言:javascript
复制
WITH cte AS
 (
   SELECT *
     ,ROW_NUMBER()
      OVER(PARTITION BY ID  -- latest date per ID, prefer 'Closed' over 'Open'
           ORDER BY Date DESC, Status) AS rn
   FROM tab
 )
SELECT * -- all columns but rn
FROM cte
WHERE rn = 1;
票数 3
EN

Stack Overflow用户

发布于 2018-04-07 14:16:21

你可以用ROW_NUMBER

代码语言:javascript
复制
SELECT *
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date DESC) AS rn
      FROM tab) sub
WHERE sub.rn = 1;
票数 1
EN

Stack Overflow用户

发布于 2018-04-07 14:17:08

在Server中,可以使用row_number()。然而,最有效的方法往往是比较老套的方法:

代码语言:javascript
复制
select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.id = t.id);

如果您在t(id, date)上有一个索引,这一点尤其正确。

另一个可以具有更好性能的方法是apply。这假设您有一个ids

代码语言:javascript
复制
select t.*
from ids cross apply
     (select top 1 t.*
      from t
      where t.id = ids.id
      order by t.date desc
     ) t;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49708288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档