如何根据特定订单选择每组的顶行?

时间:2013-01-28 17:37:58

标签: sql sql-server-2008 greatest-n-per-group

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

  • 表名[数据]。
  • 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和该父项的所有条目),我想选择最新的行,并且还替换空的ParentID(通常表示此行是parent)与行自己的PrimaryID。

我真的迷失在哪里甚至开始生成这样的查询。

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

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

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

2 个答案:

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

请参阅SQL Fiddle with Demo

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