这是我的示例数据集:
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 之后的那些行,并且我已经考虑过窗口函数的各种组合来尝试此操作,但我正在尝试将头撞在墙上做对了。
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
)