mysql - 如何将可重复的分区作为一个又一个分区的新分区?
问题描述
OVER 子句中的“Partition by”将所有值分组为唯一值,就像“Distinct”或“Group by”一样。
这就是它在我的 row_number() 查询中的工作方式:
id st t row_number
-------------------
1 1 1 1
1 1 2 2
1 1 3 3
2 1 3 1
1 2 4 1
1 1 10 4
这就是我要的:
id st t uniq_row_number
------------------
1 1 1 1
1 1 2 2
1 1 3 3
2 1 3 1
1 2 4 1
1 1 10 1
无论之前是否有新字符串,每次更改分区后都会将其读取为新分区。如果分区重复,则 uniq_row_number 得到 +1。如果新分区带有新字符串:boom,它将获得 uniq_row_number 1。
我的 SQL 查询:
SELECT id, st, t,
row_number() OVER (PARTITION BY id, st ORDER BY id, st) cat_num,
min(t) over (PARTITION BY id, st) min_t,
max(t) over (PARTITION BY id, st) max_t
FROM tabl ORDER BY t;
SQL 代码在这里:http ://sqlfiddle.com/#!18/d4290/2
解决方案
这被称为“差距和岛屿”问题。您需要为每个具有相似值的“岛”定义一个组。然后你可以使用row_number()
.
行号的不同是定义岛的一种方便方法:
select t.*,
row_number() over (partition by id, seqnum_t - seqnum_it
order by t
) as uniq_row_number
from (select t.*,
row_number() over (order by t) as seqnum_t,
row_number() over (partition by id order by t) as seqnum_it,
from t
) t;
了解其工作原理的最佳方法是查看子查询的结果。您应该能够看到行号的差异如何定义您关心的组。
推荐阅读
- java - 使用 Saxon-HE 在 XSLT 2.0 中检索 hashmap 值
- parsing - 从 mariadb 中的混合字符串中提取 UUID
- java - 如何使用 Servlet 从会话中获取 userLoginId
- windows - 在 Windows (MinGW) 上编译 Nasm 程序时对“WinMain”的未定义引用
- c# - 自定义标题栏作为数据透视表头
- api-platform.com - ApiFilter 和 GroupFilter 用途和用法
- bash - linux中grep TLS命令有什么用?
- sql - [Vertica][Support] (50310) 无法识别的 ICU 转换错误
- php - Node.js 等效于 php 中的 htmlspecialchars
- python - 嵌套的可迭代映射/过滤