例如,我有一个数据集,该数据集由一个ID以及开始时间和结束时间(ID,开始时间,结束时间)组成:
我需要使用sql代码将此数据集重新建模为以下格式(combined_ID,start_time,end_time):
有人可以帮我吗?
答案 0 :(得分:0)
我同意Mike Walton的观点,Stackoverflow并不是要求免费工作的地方,
但这真是古怪,我无法抗拒。
您的示例只有两个间隔,因此我不得不猜测如何处理任意数量的间隔。
这是我的路线:
WITH
INPUT AS (SELECT * FROM VALUES ('A', 09, 11), ('B', 10, 12), ('C', 8, 11) T(ID, START_TIME, END_TIME)),
SEGMENTS AS (
SELECT
SEGMENT_POINT SEGMENT_START,
LEAD(SEGMENT_POINT, 1) OVER (ORDER BY SEGMENT_POINT) SEGMENT_END
FROM (SELECT START_TIME SEGMENT_POINT FROM INPUT UNION SELECT END_TIME FROM INPUT)
)
SELECT * FROM INPUT
UNION
SELECT
LISTAGG(ID, '/') WITHIN GROUP (ORDER BY ID),
SEGMENT_START,
ANY_VALUE(SEGMENT_END)
FROM INPUT /* Intersect with SEGMENTS */
INNER JOIN SEGMENTS ON START_TIME < SEGMENT_END AND END_TIME > SEGMENT_START
GROUP BY SEGMENT_START HAVING COUNT(ID) > 1
ORDER BY 2, 1;
仅使用A和B,查询将输出您上面列出的内容。加(C,8,11)将输出:
ID START_TIME END_TIME
C 8 11
A 9 11
A/C 9 10
A/B/C 10 11
B 10 12