【问题标题】:SQL time difference between two dates multiple conditionsSQL时间差两个日期多个条件
【发布时间】:2020-01-03 08:41:12
【问题描述】:

我有一张桌子 (T1),看起来像这样:

    ID  Date    Event
1   01/01/2010  A
1   04/01/2010  B
1   06/01/2010  A
1   09/01/2010  A
1   15/01/2010  B
2   01/02/2010  A
2   04/04/2010  A
2   01/02/2010  C
2   04/04/2010  C

我想根据“ID”和“事件”列计算两个日期之间的差异。我需要一个看起来像这样的表(T2):

ID  Date    Date2   Ndays   Event
1   01/01/2010  06/01/2010  5   A
1   06/01/2010  09/01/2010  3   A
1   04/01/2010  15/01/2010  11  B
2   01/02/2010  04/04/2010  62  A
2   01/02/2010  04/04/2010  62  C

【问题讨论】:

  • 这看起来像是一个间隙和孤岛式问题,在 Access(不支持分析函数)上可能很难解决。

标签: ms-access multiple-columns lag days


【解决方案1】:

一个简单的 Group By 查询就可以了:

SELECT 
    Events.ID, 
    Min(Events.Date) AS Date1, 
    Max(Events.Date) AS Date2, 
    DateDiff('d',[Date1],[date2]) AS NDays, 
    Events.Event
FROM 
    Events
GROUP BY 
    Events.ID, 
    Events.Event;

输出:

编辑:

要获得更多记录,请使用子查询:

SELECT 
    Events.ID, 
    Events.Date AS Date1, 
    (Select Min(T.Date) 
    From Events As T 
    Where T.ID = Events.ID And T.Event = Events.Event And T.Date > Events.Date) AS Date2, DateDiff('d',[Date1],[date2]) AS NDays, 
    Events.Event
FROM 
    Events
GROUP BY 
    Events.ID, 
    Events.Date, 
    Events.Event
HAVING 
    (Select Min(T.Date) 
    From Events As T 
    Where T.ID = Events.ID And T.Event = Events.Event And T.Date > Events.Date) Is Not Null
ORDER BY 
    Events.ID, 
    Events.Event, 
    Events.Date;

输出:

【讨论】:

  • 您好,非常感谢。它工作得很好。不幸的是,我意识到对于某些 ID,我可以为同一事件有两个以上的日期。我已经相应地编辑了我的问题(参见 ID 1 事件 A);再次感谢
  • 请查看扩展答案。
【解决方案2】:

使用自联接和聚合:

SELECT t.ID, t.Date, 
  MIN(tt.Date) AS Date2, 
  DATEDIFF('d', t.Date, Date2) AS NDays,
  t.Event
FROM tablename t INNER JOIN tablename tt
ON tt.ID = t.ID AND tt.Event = t.Event AND t.Date < tt.Date
GROUP BY t.ID, t.Date, t.Event
ORDER BY t.ID, t.Event, t.Date

结果:

ID  Date        Date2       NDays   Event
1   1/1/2010    6/1/2010    5       A
1   6/1/2010    9/1/2010    3       A
1   4/1/2010    15/1/2010   11      B
2   1/2/2010    4/4/2010    62      A
2   1/2/2010    4/4/2010    62      C

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 2021-08-18
    • 2021-10-21
    • 2011-01-08
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多