在sql中将相同且相邻的分组

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

表:

网站_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

我正在使用雪花。

sql snowflake-cloud-data-platform grouping
1个回答
0
投票

这是变相的差距和孤岛问题。你的要求是在每组

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;
© www.soinside.com 2019 - 2024. All rights reserved.