在SQL中,如何只保留包含特定值的行之后出现的行?

问题描述 投票:0回答:1

这是我的示例数据集:

zone_id 子区域_id 近期 操作
p01 1 0 1
p01 1 1 2
p01 1 2 1
p01 1 3 0
p01 1 4 1
p01 1 5 0
p01 1 6 1
p01 1 7 1
p02 1 0 1
p02 2 0 0
p02 2 1 1

我想做的是仅保留最近出现的任何

operation
值 0 之后的行,按
zone_id
subzone_id
分组,其中新近度由同名列指示(最低值=最新)。

因此,在此示例中,所需的解决方案将仅返回这些行:

zone_id 子区域_id 近期 操作
p01 1 6 1
p01 1 7 1
p02 1 0 1
p02 2 1 1

我知道我需要添加某种指示符列,仅标记最近出现的 0 之后的那些行,并且我已经考虑过窗口函数的各种组合来尝试此操作,但我正在尝试将头撞在墙上做对了。

sql snowflake-cloud-data-platform ansi
1个回答
0
投票
SELECT
  t.*
FROM
  your_table   AS t
WHERE
  t.recency > (
    SELECT IFNULL(MAX(recency), -1)
      FROM your_table
     WHERE zone_id = t.zone_id
       AND subzone_id = t.subzone_id
       AND operation = 0
  )

或者...

WITH
  augmented AS
(
  SELECT * FROM your_table
  UNION ALL
  SELECT
    zone_id, subzone_id, -1, 0
  FROM
    your_table
  GROUP by
    zone_id, subzone_id
)
SELECT
  *
FROM
  augmented
QUALIFY
  recency
  >
  FIRST_VALUE(recency)
    OVER (
      PARTITION BY zone_id, subzone_id 
          ORDER BY operation, recency DESC
    )
© www.soinside.com 2019 - 2024. All rights reserved.