如何按rowCount排序查询temp表,直至出现key1、key2、key3组合重复?
解决方案
可以实现该需求,核心思路是先定位第一个出现(key1,key2,key3)组合重复的记录位置,再筛选该位置之前的所有记录。
表结构与数据
| key1 | key2 | key3 | key4 | rowCount |
|---|---|---|---|---|
| k1.1 | k2.1 | k3.1 | k4.1 | 1 |
| k1.2 | k2.2 | k3.2 | k4.2 | 2 |
| k1.3 | k2.3 | k3.3 | k4.3 | 3 |
| k1.1 | k2.1 | k3.1 | k4.4 | 4 |
| k1.5 | k2.5 | k3.5 | k4.5 | 5 |
| k1.6 | k2.6 | k3.6 | k4.6 | 6 |
实现SQL
SELECT t.* FROM temp t WHERE t.rowCount < ( SELECT MIN(rowCount) FROM ( SELECT key1, key2, key3, rowCount, ROW_NUMBER() OVER (PARTITION BY key1, key2, key3 ORDER BY rowCount) AS rn FROM temp ) sub WHERE rn = 2 );
逻辑说明
- 内层子查询通过
ROW_NUMBER()窗口函数,为每个(key1,key2,key3)组合的记录按rowCount升序编号:首次出现的记录标记为rn=1,重复出现的标记为rn=2。 - 中间子查询找出所有
rn=2的记录中最小的rowCount,也就是第一个出现组合重复的位置(示例中为4)。 - 外层查询筛选所有
rowCount小于该值的记录,即可得到截止到首次重复前的所有数据。
期望结果
| key1 | key2 | key3 | key4 | rowCount |
|---|---|---|---|---|
| k1.1 | k2.1 | k3.1 | k4.1 | 1 |
| k1.2 | k2.2 | k3.2 | k4.2 | 2 |
| k1.3 | k2.3 | k3.3 | k4.3 | 3 |
内容的提问来源于stack exchange,提问作者user3115056
相关产品推荐
相关产品推荐

