【发布时间】:2021-09-18 23:52:06
【问题描述】:
为标题道歉 - 想不出一个符合我想做的事!
所以我有包含这些房间的 ID 值、房间和进入/退出日期/时间的数据。有时数据输入不是很好,ID 退出并进入同一个房间,创建一个中断,这是我想删除的,以便获得他们在房间中的连续时间。
当只有一个“块”日期/时间使用时,我可以做到这一点
RANK() (PARTITION BY TicketNo, Room ORDER BY Entered_DTTM asc) as [RankbyEntered_DTTM]
and
RANK() (PARTITION BY TicketNo, Room ORDER BY Exit_DTTM desc) as [RankbyExit_DTTM]
在 2 个子查询中获取最早进入和最晚退出,然后使用 Rank = 1 将它们连接回原始表,但如果一个 ID 有 2 个单独的句点,则它不考虑在中间。
数据的一个例子(我曾经在中途得到的排名)是这样的:
| TicketNo | Room | Entered_DTTM | Exit_DTTM | RankbyEntered_DTTM | RankbyExit_DTTM |
|---|---|---|---|---|---|
| 65768 | A | 05/01/2019 18:55 | 05/01/2019 19:30 | 1 | 1 |
| 65768 | B | 05/01/2019 19:30 | 05/01/2019 19:35 | 1 | 5 |
| 65768 | B | 05/01/2019 19:35 | 05/01/2019 20:18 | 2 | 4 |
| 65768 | C | 05/01/2019 20:18 | 05/01/2019 20:34 | 1 | 1 |
| 65768 | D | 05/01/2019 20:34 | 05/01/2019 20:59 | 1 | 1 |
| 65768 | E | 05/01/2019 20:59 | 05/01/2019 21:15 | 1 | 2 |
| 65768 | E | 05/01/2019 21:15 | 05/01/2019 21:20 | 2 | 1 |
| 65768 | B | 05/01/2019 21:20 | 05/01/2019 21:22 | 3 | 3 |
| 65768 | B | 05/01/2019 21:22 | 05/01/2019 21:23 | 4 | 2 |
| 65768 | B | 05/01/2019 21:23 | 05/01/2019 21:37 | 5 | 1 |
这就是我想要的方式:
| TicketNo | Room | Entered_DTTM | Exit_DTTM |
|---|---|---|---|
| 65768 | A | 05/01/2019 18:55 | 05/01/2019 19:30 |
| 65768 | B | 05/01/2019 19:30 | 05/01/2019 20:18 |
| 65768 | C | 05/01/2019 20:18 | 05/01/2019 20:34 |
| 65768 | D | 05/01/2019 20:34 | 05/01/2019 20:59 |
| 65768 | E | 05/01/2019 20:59 | 05/01/2019 21:20 |
| 65768 | B | 05/01/2019 21:20 | 05/01/2019 21:37 |
但我无法为房间 B 买这个:
| TicketNo | Room | Entered_DTTM | Exit_DTTM |
|---|---|---|---|
| 65768 | B | 05/01/2019 19:30 | 05/01/2019 21:37 |
任何帮助将不胜感激!
【问题讨论】:
-
搜索“差距和孤岛”问题。还有很多用它标记的问题:[gaps-and-islands]
标签: sql sql-server date tsql grouping