2

假设我有一个包含以下数据的表。

  • 表名 [数据]。
  • PrimaryID:表的主 ID。
  • ParentID:表引用自身;这是对 PrimaryID 的 FK 约束。
  • 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 和该父级的所有条目),我想选择最近的行,并将 null ParentID(通常表示该行是父行)替换为该行自己的 PrimaryID。

我真的不知道从哪里开始生成这样的查询。

我有一个看起来像这样的内部选择:

(SELECT PrimaryID, ISNULL(ParentID, PrimaryID) as ParentID, Date FROM [Data])

这看起来是正确的开始方向,但我不知道从哪里开始。

4

2 回答 2

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

请参阅带有演示的 SQL Fiddle

于 2013-01-28T17:42:54.327 回答
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

于 2013-01-28T17:41:25.677 回答