【问题标题】:Lost on creating a query for this scenario为这种情况创建查询时迷失了
【发布时间】:2013-08-25 18:21:57
【问题描述】:

这是表结构的简化版本。

Employee  
(  
    ID          GUID   NOT NULL
    OldID           GUID   NULL
    Name            VARCHAR(50) NOT NULL
    CreationDate    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
)

它包含员工信息以及对员工属性所做的任何更改。这样我们就可以对所做的更改进行完整的审核。当 OldID 为 NULL 时,这基本上意味着最新的数据。这是一个示例,我使用整数值作为标识符以使此示例更易于理解。

ID  OldId       Name        CreationDate  
13  NULL        John        15-July-2013  
12  13      John1       14-July-2013  
11  12      John2       13-July-2013  
10  11      John3       12-July-2013  
121 NULL        Smith       15-July-2013  

首先,我可以通过

从表中获取唯一员工
SELECT ID, Name FROM Employee WHERE OldId IS NULL

我正在寻找最新的 ID,但它的最早名称。所以结果应该是两行

ID     Name  
13     John3  
121    Smith  

我不确定如何获得这些结果。任何帮助将不胜感激。

【问题讨论】:

  • 好吧,+1 可能是今天第一个在日期/时间列中存储日期/时间值的人。
  • OldID 的示例值看起来像新记录的 ID...
  • 如果我在示例中使用了 guid,那么查看链接会有点棘手,这就是为什么我在发布“我使用整数值作为标识符以使该示例更易于理解”中提到它的原因。”
  • 看起来你想做一个递归自加入。见这里:stackoverflow.com/questions/1757260/…
  • 您能否展示您想要的结果?您想要每个员工的最早最新姓名吗?在不同的行中,还是在同一行中?单词问题并不好玩(到目前为止,有两个人因此而崩溃并烧毁了答案)。向我们展示预期的输出,这样我们就不必猜测了。

标签: sql-server-2008 tsql


【解决方案1】:

这是一种适用于您的数据的方法:

with groups as
(
  select groupID = ID, *
  from Employee
  where OldID is null
  union all
  select g.groupID, e.*
  from groups g
    inner join Employee e on g.ID = e.OldID
)
, ranks as
(
  select *
    , firstRank = row_number () over (partition by groupID order by creationDate)
  from groups
)
select ID = groupID
  , Name
from ranks
where firstRank = 1

SQL Fiddle with demo.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多