假设我有一张包含以下数据的表格。
DateTime:上次更新的时间。
PrimaryID ParentID Date
1 null 1/1/2013
2 1 1/2/2013
3 1 1/3/2013
4 null 1/4/2013
5 4 1/5/2013
6 null 1/6/2013
我想选择如下所示的结果:
PrimaryID ParentID
3 1
5 4
6 6
对于每个“组”(定义为具有相同ParentID和该父项的所有条目),我想选择最新的行,并且还替换空的ParentID(通常表示此行是parent)与行自己的PrimaryID。
我真的迷失在哪里甚至开始生成这样的查询。
我有一个内部选择,看起来像这样:
(SELECT PrimaryID, ISNULL(ParentID, PrimaryID) as ParentID, Date FROM [Data])
这看起来是正确的开始方向,但我不知道从哪里开始。
答案 0 :(得分:3)
您可以使用row_number()
:
select primaryid,
coalesce(ParentID, PrimaryID) parentid
from
(
select *,
row_number() over(partition by coalesce(ParentID, PrimaryID)
order by date desc) rn
from yourtable
) src
where rn = 1
答案 1 :(得分:2)
在@ypercube的帮助下,这样的事情应该有效:
SELECT t.PrimaryId, coalesce(t.ParentId,t.PrimaryId) as parent
FROM YourTable t
JOIN (
SELECT coalesce(ParentId, PrimaryId) as parent, Max(DateField) as dtMax
FROM YourTable
GROUP BY coalesce(ParentId, PrimaryId)
) t2 ON coalesce(t.ParentId,t.PrimaryId) = parent AND t.DateField = t2.dtMax
这是更新的Fiddle。