sql - 如何识别重叠行
问题描述
我需要识别重叠的行。下面是表格,我需要列重叠:
| identifier | status | startDate | endDate | pID | OVERLAPPING |
|------------ |---------- |------------ |------------ |----- |------------- |
| A | Approved | 2020-10-01 | 2020-10-07 | x1 | Yes |
| A | Approved | 2020-10-01 | 2020-10-07 | x2 | No |
| A | Approved | 2020-10-01 | 2020-10-07 | x3 | Yes |
| A | Approved | 2020-10-01 | 2020-10-07 | x4 | No |
| B | Approved | 2020-10-10 | 2020-10-12 | x2 | No |
| B | Approved | 2020-10-10 | 2020-10-12 | x5 | No |
| C | Rejected | 2020-10-05 | 2020-10-06 | x3 | No |
| C | Rejected | 2020-10-05 | 2020-10-06 | x7 | No |
| C | Rejected | 2020-10-05 | 2020-10-06 | x8 | No |
| C | Rejected | 2020-10-05 | 2020-10-06 | x9 | No |
| D | Approved | 2020-10-01 | 2020-10-07 | x5 | No |
| D | Approved | 2020-10-01 | 2020-10-07 | x1 | Yes |
| E | Approved | 2020-10-03 | 2020-10-04 | x3 | Yes |
- 由于 C 处于拒绝状态,因此任何具有 C 标识符的内容都不会被计入查找重叠行。因此即使 C 中的坚韧 x3 与 A 中的 x3 重叠,也不会被视为重叠。
- x1 在 A 和 D 中重叠。因此这两行都将被计为重叠。
- A 中的 x3 与 E 中的 x3 重叠,因为 E 的开始日期和结束日期在 A 的期间内。
- B 和 D 中的 x5 不重叠,因为 B 和 D 的日期不重叠。
如果开始日期和结束日期相同,我可以通过创建一个由开始日期、结束日期和 pID 组合而成的列,然后计算所有行的该字段来获得此信息。如果它大于 1,那么我标记重叠。但这不包括 x3 的场景,其中开始日期和日期不相同但在一段时间内仍然重叠。
解决方案
像这样的东西?
(如果一行与其他行重叠,我使用相关子查询来避免返回多行的连接。)
SELECT
*,
(
SELECT 1
FROM yourTable AS lookup
WHERE lookup.identifier <> yourTable.identifier -- Don't check overlaps with itself
AND lookup.pID = yourTable.pID
AND lookup.startDate <= yourTable.endDate
AND lookup.endDate >= yourTable.startDate
LIMIT 1
)
FROM
yourTable
注意>=
and <=
,这取决于您使用的是包容性(我希望不是)还是排他性(我希望如此)endDate
。
推荐阅读
- python - 使用 Selenium 和 Python 检查表 Web 中项目的背景
- azure-devops - Windows XP 上的 Azure DevOps Server 构建代理
- cron - crontab 和 Rundeck 之间有集成吗?
- visual-studio-code - 无法在 alpine linux 上的代码服务器上打开终端
- html - 与页脚重叠的行
- r - 识别在空间和时间上重叠的观测
- android - 在 Android 上通过 Intent 启动华为花瓣地图方向
- spring-boot - JPA 查询超时
- python - 无法在 Python 中的 JSON 字符串中插入变量
- powerbi - 为什么说只有 CALCULATE 可以修改过滤器上下文?