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