sql - 如何根据这个特定的日期条件过滤我的表格?
问题描述
我正在使用SQL Server 2014
. 以下是 Table 的摘录t1
:
rownum RoomID ArrivalDate DepartureDate Name GuestID
1 287 2020-01-01 2020-01-09 John 600
2 451 2020-01-09 2020-01-10 John 600
3 458 2020-01-09 2020-01-10 John 600
1 240 2020-03-19 2020-03-21 Alan 112
2 159 2020-03-21 2020-03-22 Alan 112
1 400 2020-05-01 2020-05-10 Joe 225
2 155 2020-06-13 2020-06-18 Joe 225
1 200 2020-07-01 2020-07-08 Smith 980
2 544 2020-07-08 2020-07-10 Smith 980
3 428 2020-09-01 2020-09-05 Smith 980
...
问题:我需要过滤此表,以便输出只为我提供客人的那些行,其中他的 ArrivalDate(在 rownum 2 或 3 或 4...)和他的 DepartureDate(在 rownum = 1)之间存在差异大于 0。
简化:如果我们选择客人 John,他的 ArrivalDate for rownum=2 和 rownum=3 都与他的 DepartureDate for rownum=1 相同;因此我想在我的输出中完全排除他。客人艾伦也一样。但是,仅对于需要排除 rownum=2 的 Guest Smith。
注意:此表中的所有客人都至少有一个 rownum=2(即至少有 2 个条目)。
我的预期输出:
rownum RoomID ArrivalDate DepartureDate Name GuestID
1 400 2020-05-01 2020-05-10 Joe 225
2 155 2020-06-13 2020-06-18 Joe 225
1 200 2020-07-01 2020-07-08 Smith 980
3 428 2020-09-01 2020-09-05 Smith 980
我被困在如何编写这个过滤器背后的逻辑。任何帮助,将不胜感激。
解决方案
这里的技巧似乎是在匹配时保留第一行 - 但不包括任何其他行。您可以使用窗口函数:
select t.*
from (select t.*,
max(case when rownum = 1 then departuredate end) over (partition by guestid) as departuredate_1,
max(case when rownum <> 1 then arrivaldate end) over (partition by guestid) as arrivaldate_not_1
from t1 t
) t
where (arrivaldate_not_1 > departuredate_1) and
(rownum = 1 or arrivaldate > departuredate_1);
这是一个 db<>fiddle。
推荐阅读
- java - 动态排列表格的行
- typescript - 允许与打字稿中数组中的项目匹配的任何值
- cmake - 致命错误:运行 tesseract 时找不到“emscripten.h”文件
- haskell - Haskell 中的表达式是什么?
- c# - unity手游触控动作不扎实
- python - Python解析结果与mysql不匹配
- python - 为 OOV 词添加新向量的正确方法
- node.js - 无法连接在本地主机上的不同端口上工作的客户端(ReactJS)和后端(NodeJS)
- transactions - 在 Hyperledger Fabric 中借记和贷记(更改)状态数据
- python - 如何使用 eyed3 将艺术品放入 Tkinter Image?