【发布时间】:2021-02-24 18:34:11
【问题描述】:
我有一张这样的桌子-
| row_no | Movie. | movie_start_time | movie_end_time |
|---|---|---|---|
| 1 | A | 2021-02-01 01:00:00 | 2021-02-01 02:00:00 |
| 2 | B | 2021-02-01 01:00:00 | 2021-02-01 02:00:00 |
| 3 | A | 2021-02-01 01:30:00 | 2021-02-01 02:30:00 |
| 4 | A | 2021-02-01 01:30:00 | 2021-02-01 02:30:00 |
| 5 | A | 2021-02-01 02:15:00 | 2021-02-01 03:15:00 |
| 6 | B | 2021-02-01 02:15:00 | 2021-02-01 03:15:00 |
| 7 | A | 2021-02-01 04:15:00 | 2021-02-01 05:15:00 |
我想在表中添加一个额外的列,该列在同一部电影的先前播放时间和当前播放时间之间存在差异。我还有一个条件是之前的播放时间和当前的播放时间不应该重叠。所以在上面的场景中,结果应该如下所示:
| row_no | Movie. | movie_start_time | movie_end_time. | last_play |
|---|---|---|---|---|
| 1 | A | 2021-02-01 01:00:00 | 2021-02-01 02:00:00 | - |
| 2 | B | 2021-02-01 01:00:00 | 2021-02-01 02:00:00 | - |
| 3 | A | 2021-02-01 01:30:00 | 2021-02-01 02:30:00 | - |
| 4 | A | 2021-02-01 01:30:00 | 2021-02-01 02:30:00 | - |
| 5 | A | 2021-02-01 02:15:00 | 2021-02-01 03:15:00 | 15 minutes |
| 6 | B | 2021-02-01 02:15:00 | 2021-02-01 03:15:00 | 15 minutes |
| 7 | A | 2021-02-01 04:15:00 | 2021-02-01 05:15:00 | 60 minutes |
我尝试编写以下查询以获取上一个电影结束时间,以便稍后计算差异:
select movie, movie_start_time, movie_end_time, lag(movie_end_time) over (partition by movie order by movie_start_time) prev_end_time from table where prev_end_time <= movie_start_time
但这不起作用,因为我们不能在窗口函数中添加 where 子句。有没有其他方法可以解决这个问题?
【问题讨论】:
-
select * from (<that query of yours>) t where prev_end_time <= movie_start_time? -
你确定第五行是正确的吗?因为它与第四行的另一部电影 A 重叠。
-
@GSerg 这行不通,因为滞后只会给我上一行,我需要满足条件 prev_end_time 的上一行
-
@ARAT 我认为我选择的示例有点令人困惑 - 第 5 行 15 分钟是与不重叠的先前记录的区别 - 这是第 1 行