首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用(雪花) sql基于重叠时间戳组合记录

使用(雪花) sql基于重叠时间戳组合记录
EN

Stack Overflow用户
提问于 2019-11-21 13:05:01
回答 1查看 288关注 0票数 0

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

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

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

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

有人能帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2019-11-21 15:55:24

我同意Mike Walton的观点,斯塔克溢出不是要求免费工作的地方,

但这太奇怪了我无法抗拒。

您的示例只有两个间隔,因此我不得不猜测如何处理任意数量的间隔。

这是我的行动:

代码语言:javascript
复制
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)将输出:

代码语言:javascript
复制
ID     START_TIME   END_TIME
C               8         11
A               9         11
A/C             9         10
A/B/C          10         11
B              10         12
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58975778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档