1

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

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

4

1 回答 1

0

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

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;
于 2021-09-28T13:34:56.033 回答