表:
网站_id | 更新于 | 显示_id |
---|---|---|
1222 | 03-06 06:00 | 苹果 |
1222 | 03-06 08:00 | 苹果 |
1222 | 03-06 10:00 | 胡萝卜 |
1222 | 03-06 12:00 | 苹果 |
1222 | 03-06 14:00 | 图 |
1234 | 03-06 06:00 | 苹果 |
1234 | 03-06 08:00 | 桃子 |
我想对行进行标记,以便将彼此相邻的相同显示 ID 分组,但如果顺便说一句还有其他内容,则不会对它们进行分组。 期望的结果应该如下:
网站_id | 更新于 | 显示_id | 组标签 |
---|---|---|---|
1222 | 03-06 06:00 | 苹果 | 1 |
1222 | 03-06 08:00 | 苹果 | 1 |
1222 | 03-06 10:00 | 胡萝卜 | 2 |
1222 | 03-06 12:00 | 苹果 | 3 |
1222 | 03-06 14:00 | 图 | 4 |
1234 | 03-06 06:00 | 苹果 | 1 |
1234 | 03-06 08:00 | 桃子 | 2 |
我正在使用雪花。
这是变相的差距和孤岛问题。你的要求是在每组
display_id
内形成类似websit_id
的岛,然后使用时间戳进行排名。这是使用行数差异法的一种方法:
WITH cte1 AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY websit_id ORDER BY updated_at) rn1,
ROW_NUMBER() OVER (PARTITION BY websit_id, display_id ORDER BY updated_at) rn2
FROM yourTable
),
cte2 AS (
SELECT *, MAX(updated_at) OVER (PARTITION BY websit_id, display_id, rn1 - rn2) AS max_updated_at
FROM cte1
)
SELECT websit_id, updated_at, display_id,
DENSE_RANK() OVER (PARTITION BY websit_id ORDER BY max_updated_at DESC) AS group_label
FROM cte2
ORDER BY websit_id, updated_at DESC;