【问题标题】:SQL to have dates from different tables appear in chronological order by columnSQL 让来自不同表的日期按列按时间顺序显示
【发布时间】:2019-12-03 12:59:11
【问题描述】:

我想从三个不同的表中查询日期,并将每个日期按时间顺序排列到列中。每个表 Event1、Event2 和 Event3 都包含按时间顺序对任何一个人发生的事件日期(即 Event1 应该在 Event2 之前发生,而 Event2 应该在 Event3 之前发生)。但碰巧一个人的 Event1 日期在 Event2 和 Event3 之后。我想得到一个显示两行的结果集。第一行显示来自 Event2 和 Event3 的较早事件,第二行仅包含来自 Event1 的较新事件日期。下面是这个例子的数据:

主要

ID
----------
Person001
Person002
Person003
Person004
Person005

事件1

ID        | EVENT_DATE
----------+-----------
Person001 | 2019-04-30
Person002 | 2018-02-01
Person004 | 2018-05-01

事件2

ID        | EVENT_DATE
----------+-----------
Person001 | 2005-03-03
Person002 | 2018-03-15
Person003 | 2017-10-10
Person005 | 2018-10-01

事件3

ID        | EVENT_DATE
----------+-----------
Person001 | 2005-04-15
Person002 | 2019-01-10
Person004 | 2018-12-11
Person005 | 2018-12-15
Person005 | 2019-07-02

我希望结果集如下所示:

ID        | EVENT_DATE_1 | EVENT_DATE_2 | EVENT_DATE_3
----------+--------------+--------------+--------------
Person001 | NULL         | 2005-03-03   | 2005-04-15
Person001 | 2019-04-30   | NULL         | NULL
Person002 | 2018-02-01   | 2018-03-15   | 2019-01-10
Person003 | NULL         | 2017-10-10   | NULL
Person004 | 2018-05-01   | NULL         | 2018-12-11
Person005 | NULL         | 2018-10-01   | 2018-12-15
Person005 | NULL         | NULL         | 2019-07-02

我正在使用 Microsoft SQL Server。

提前致谢。

我应该澄清一下:Person001 只是一个示例个人。我想查询整个数据库。对于大多数人来说,事件将按照正确的顺序发生。但是,有些人会有多个事件实例。例如,某人可以有两个 Event1 日期。对于示例中的 Person001,他们应该有一个对应于 Event2 和 Event3 的 Event1 日期;只是碰巧缺少数据。

编辑:我添加了更多示例数据。我尝试了答案中的代码,它似乎仅适用于 Person001 的情况。如果数据点有其他排列,它似乎不起作用。我希望额外的人会考虑其他类型的场景。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    这有点奇怪,但你可以这样做:

    select id, event_date as event_date_1, null as event_date_2, null as event_date_3
    from event1
    union all
    select coalesce(e2.id, e3.id), null, e2.event_date, e3.event_date
    from event2 e2 full join
         event3 e3
         on e2.id = e3.id
    order by id, event_date_1;
    

    Here 是一个 dbfiddle。

    【讨论】:

    • 感谢您的回复。这似乎只适用于 Person001。我在其他数据上尝试过,但效果不佳。我编辑了原始帖子以包含更多示例数据。
    • 我检查了 dbfiddle,Person002 的所有事件日期应该在同一行,因为日期按正确的时间顺序排列。如果 Event1 日期存在,您的代码会将 Event1 日期放在所有 ID 的新行中。
    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2013-10-28
    • 2023-03-04
    相关资源
    最近更新 更多