sql - SQL - 以日期间隔聚合数据
问题描述
我在加入两个代表用户状态更改的日期间隔表时遇到问题。两个表中的 ID 相同。
表_A
ID StatusA FromA ToA
1 Active 01/01/2020 10:00 01/01/2020 11:30
1 NonActive 02/01/2020 09:00 03/01/2020 11:00
2 Active 01/01/2020 10:00 01/01/2020 11:30
3 Active 02/01/2020 09:30 02/01/2020 15:50
表_B
ID StatusB FromB ToB
1 Chatting 01/01/2020 10:02 01/01/2020 10:15
1 Calling 01/01/2020 10:10 01/01/2020 10:20
2 Awaiting 02/01/2020 10:00 02/01/2020 10:15
2 Calling 02/01/2020 10:16 02/01/2020 10:20
3 Awating 02/01/2020 09:30 02/01/2020 15:50
1 Awating 02/01/2020 09:00 03/01/2020 11:00
我想要获得的是这样的表格:
ID StatusA FromA ToA StatusB FromB ToB
1 Active 01/01/2020 10:00 01/01/2020 11:30 Chatting 01/01/2020 10:02 01/01/2020 10:15
1 Active 01/01/2020 10:00 01/01/2020 11:30 Calling 01/01/2020 10:10 01/01/2020 10:20
2 Active 01/01/2020 10:00 01/01/2020 11:30 Awaiting 02/01/2020 10:00 02/01/2020 10:15
2 Active 01/01/2020 10:00 01/01/2020 11:30 Calling 02/01/2020 10:16 02/01/2020 10:20
我在一开始写的查询:
SELECT Table_A.ID,
Table_A.StatusA AS "Primary_Status",
Table_A.FromA,
Table_A.ToA,
Table_B.StatusB AS "Secondary_Status",
Table_B.FromB,
Table_B.ToB,
FROM TableA
INNER JOIN Table_B ON Table_A.ID = Table_B.ID
WHERE ((Table_B.startTime BETWEEN Table_A.FromA AND Table_A.ToA)
or (Table_B.FromB <= Table_A.FromA AND Table_B.ToB <= Table_A.ToA)
or (Table_B.FromB <= Table_A.FromA AND Table_B.ToB >= Table_A.ToA)
or (Table_B.FromB BETWEEN Table_A.FromA AND Table_A.ToA AND Table_B.ToB >= Table_A.ToA)
);
提前致谢!
编辑:每个 ID 唯一标识一个用户。因此,Table_A 中 ID = 1 的用户与 Table_B 中 ID = 1 的用户相同
EDIT_02:感谢 Gordon Linoff 解决方案,我现在有了
SELECT Table_A.ID,
Table_A.StatusA AS "Primary_Status",
Table_A.FromA,
Table_A.ToA,
Table_B.StatusB AS "Secondary_Status",
Table_B.FromB,
Table_B.ToB,
FROM TableA
INNER JOIN Table_B ON (Table_A.ID = Table_B.ID AND Table_B.FromB >= Table_A.FromA AND Table_B.ToB <= Table_A.ToA)
此查询正在运行,但我可能会遇到以下情况
b.FromB <= a.FromA && b.ToB <= a.ToA
b.FromB >= a.FromA && b.ToB >= a.ToA
b.FromB <= a.FromA && b.ToB >= a.ToA
解决方案
You seem to just want a join
with the right conditions on the time columns:
SELECT a.ID, a.StatusA AS "Primary_Status", a.FromA, a.ToA,
b.StatusB AS "Secondary_Status", b.FromB, b.ToB,
FROM TableA a JOIN
Table_B b
ON a.ID = b.ID AND
b.FromB >= a.FromA AND
b.ToB <= b.FromB;
推荐阅读
- yaml - 是否可以使用 js-yaml 加载将属性设置为文件引用的 yaml 文件?
- karate - 从通过示例部分传递的 yml 文件驱动的数据在空手道中不起作用
- android - How do I reference a preference option by key in my PreferenceScreen?
- java - 在java中实现一个equals()方法来比较两个用整数填充的对象中的内容
- c# - SignalR 代理到 redis 通道
- git - LibGit2Sharp 相当于:git log release/v21.2.16..release/v21.3.2
- kubernetes - 关于如何使用 kubeadm 设置 kubernetes 集群模式的建议?
- python - 我们可以将 50 多个 Pandas 数据框更改为一张表格中的 excel 并使用 Vlookup 根据键值查看单独的数据框吗
- sql - 如何在从表中过滤选择记录的情况下获取计数百分比
- python - 对包含具有日期时间属性的对象的列表进行排序