使用(snowflake)sql根据重叠的时间戳合并记录

时间:2019-11-21 13:05:01

标签: sql database snowflake-data-warehouse

例如,我有一个数据集,该数据集由一个ID以及开始时间和结束时间(ID,开始时间,结束时间)组成:

  • (A,09,11)
  • (B,10,12)

我需要使用sql代码将此数据集重新建模为以下格式(combined_ID,start_time,end_time):

  • (A,09,10)
  • (A / B,10,11)
  • (B,11,12)

有人可以帮我吗?

1 个答案:

答案 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