获取每个ID

时间:2018-04-07 14:14:38

标签: sql sql-server tsql

在SQL Server 2008上工作,我一直在努力解决这个问题。假设我有下表:

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的最新活动相对应的状态和日期。 如果同一日期同时处于“打开”和“已关闭”状态,则默认为“已关闭”。因此,使用上表,结果应为:

ID      Status      Date (YYYY-MM-DD)
A-1     Closed      2018-01-05
B-2     Closed      2018-02-06
C-3     Open        2018-03-07

4 个答案:

答案 0 :(得分:2)

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;

答案 1 :(得分:1)

您可以使用.slick-dots li button { text-indent: -9999px; }

ROW_NUMBER

答案 2 :(得分:1)

在SQL Server中,您可以使用row_number()。但是,最有效的方法通常是更老式的方法:

select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.id = t.id);

如果您在t(id, date)上有索引,则尤其如此。

另一种可以获得更好性能的方法是apply。这假设您有一个ids表:

select t.*
from ids cross apply
     (select top 1 t.*
      from t
      where t.id = ids.id
      order by t.date desc
     ) t;

答案 3 :(得分:1)

始终有 WITH TIES 选项。

CTE方法往往 略微 更高效。

DenseMatrix