【问题标题】:Find records with SQL that have overlapping time frames使用 SQL 查找具有重叠时间范围的记录
【发布时间】:2021-11-14 17:52:23
【问题描述】:

我想知道如何为特定场景编写查询。我有一个数据集:

key valid_from  valid_to    position
a   2019        9999            1
a   2021        9999            2
b   2017        2021            1
b   2021        9999            2

我只想展示这些不具有重叠时间范围的记录以及具有较小位置编号的重叠记录,就像这样:

key valid_from  valid_to    position
a   2019        9999            1
b   2017        2021            1
b   2021        9999            2

我想在一个查询或多个查询中执行此操作,首先选择确实具有重叠时间段的记录,但现在不知道如何执行此操作。 也许有人可以帮助我解决这个问题。 BR P

【问题讨论】:

  • 如果有 3 条记录 a,2017,2019,您的预期输出是什么 | a,2018,2021|a,2020,2022
  • 我看不出您的示例如何说明您指定的问题。也许这是“重叠”的定义。或许key与问题有关。

标签: sql date snowflake-sql


【解决方案1】:

我认为这样的事情会起作用:

DROP TABLE IF EXISTS T1;
CREATE TEMPORARY TABLE T1 (
    key string,
    valid_from int,
    valid_to int,
    position int);

INSERT INTO PUBLIC.T1 (key, valid_from, valid_to, position)
VALUES  ('a',   2019, 9999, 1),
        ('a',   2021, 9999, 2),
        ('b',   2017, 2021, 1),
        ('b',   2021, 9999, 2);

SELECT a.* 
  FROM T1 AS a
  LEFT JOIN T1 AS b
       ON a.key = b.key
      AND a.position <> b.position
      AND a.valid_from < b.valid_to
      AND b.valid_from < a.valid_to
QUALIFY ROW_NUMBER() OVER(PARTITION BY a.key, b.key ORDER BY a.position) = 1 OR b.key IS NULL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多