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

In SQL, how can I keep only the rows which occur after a row containing a certain value?

提问人:idiocache 提问时间:11/17/2023 最后编辑:Thomas Dickeyidiocache 更新时间:11/20/2023 访问量:62

问:

这是我的示例数据集:

zone_id subzone_id 新近度 操作
第 01 页 1 0 1
第 01 页 1 1 2
第 01 页 1 2 1
第 01 页 1 3 0
第 01 页 1 4 1
第 01 页 1 5 0
第 01 页 1 6 1
第 01 页 1 7 1
第 02 页 1 0 1
第 02 页 2 0 0
第 02 页 2 1 1

我试图做的是只保留最近出现任何值 0 之后的行,由 和 分组,其中新近度由同名列表示(最低值 = 最近)。operationzone_idsubzone_id

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

zone_id subzone_id 新近度 操作
第 01 页 1 6 1
第 01 页 1 7 1
第 02 页 1 0 1
第 02 页 2 1 1

我知道我需要添加某种指示器列,在最近出现 0 后仅标记那些行,并且我已经考虑过窗口函数的各种组合来尝试这一点,但我正在用头撞墙试图把它弄对。

sql snowflake-cloud-data-platform ansi-sql

评论

0赞 MatBailie 11/17/2023
您在寻找 SELECT 语句还是 DELETE 语句?
0赞 MatBailie 11/17/2023
为什么 (p02, 1) 会返回任何内容?它遵循零...
0赞 Tim Biegeleisen 11/17/2023
哪些列提供了(您认为)此处存在的顺序?
0赞 MatBailie 11/17/2023
@TimBiegeleisen新近度列where recency is indicated by the column of the same name (lowest value = most recent)
0赞 idiocache 11/17/2023
@TimBiegeleisen新近度列是订单列,如果不清楚,很抱歉。

答:

0赞 MatBailie 11/17/2023 #1
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
    )