【发布时间】:2016-07-12 12:49:54
【问题描述】:
我遇到了复杂要求的问题,我希望能得到一些帮助来解决这个问题。我的 SQL 知识很基础,我不知道如何解决这个问题。目前,我有一个Events 表,其结构如下:
ID | Name | Time | Event Type
----------------------------------------------------------
133000 | Elise | 2016-02-17 06:39:42.000 | Arrival
133000 | Elise | 2016-02-18 06:20:22.000 | Arrival
133000 | Elise | 2016-02-18 20:43:46.000 | Departure
133020 | Elise | 2016-02-19 06:29:46.000 | Arrival
133445 | Peter | 2016-02-01 20:09:00.000 | Departure
133445 | Peter | 2016-02-02 06:32:02.000 | Arrival
133445 | Peter | 2016-02-02 17:03:04.000 | Departure
133445 | Peter | 2016-02-02 19:44:06.000 | Arrival
133445 | Peter | 2016-02-02 19:56:56.000 | Departure
现在,我想以某种方式查询这些数据,使其结构如下:
ID | Name | Arrival | Departure
----------------------------------------------------------
133000 | Elise | 2016-02-17 06:39:42.000 | NULL
133000 | Elise | 2016-02-18 06:20:22.000 | 2016-02-18 20:43:46.000
133000 | Elise | 2016-02-19 06:29:46.000 | NULL
133445 | Peter | NULL | 2016-02-01 20:09:00.000
133445 | Peter | 2016-02-02 06:32:02.000 | 2016-02-02 17:03:04.000
133445 | Peter | 2016-02-02 19:44:06.000 | 2016-02-02 19:56:56.000
换句话说,我有两个新列:Arrival 和 Departure。然后对于表中的每个人,按时间顺序应用以下逻辑:
- 如果
Event Type为Arrival,则应将其映射到Arrival列中具有Time值的新行。 - 如果
Event Type是Departure,检查前一行是否也是Departure。如果是这样,则应将其映射到Departure列中具有Time值的新行,并且Arrival为空。如果没有,只需将Time值转移到上一行的Departure列。
最好可以通过 SQL 查询来完成,但函数也可以。我正在使用 MS SQL Server。谢谢!
【问题讨论】:
标签: sql sql-server tsql sql-view