提问人:idiocache 提问时间:11/17/2023 最后编辑:Thomas Dickeyidiocache 更新时间:11/20/2023 访问量:62
在 SQL 中,如何只保留包含某个值的行之后出现的行?
In SQL, how can I keep only the rows which occur after a row containing a certain value?
问:
这是我的示例数据集:
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 之后的行,由 和 分组,其中新近度由同名列表示(最低值 = 最近)。operation
zone_id
subzone_id
因此,在此示例中,所需的解决方案将仅返回以下行:
zone_id | subzone_id | 新近度 | 操作 |
---|---|---|---|
第 01 页 | 1 | 6 | 1 |
第 01 页 | 1 | 7 | 1 |
第 02 页 | 1 | 0 | 1 |
第 02 页 | 2 | 1 | 1 |
我知道我需要添加某种指示器列,在最近出现 0 后仅标记那些行,并且我已经考虑过窗口函数的各种组合来尝试这一点,但我正在用头撞墙试图把它弄对。
答:
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
)
评论
where recency is indicated by the column of the same name (lowest value = most recent)