如何用SQL按层级筛选并排除前置重复值生成指定结果集?
解决方案:按层级优先级保留首次出现的数值
首先,我把你的原始数据和期望结果整理成更清晰的表格形式:
原始数据
| First | Second |
|---|---|
| 0256 | 1 |
| 5264 | 4 |
| 2589 | 3 |
| 2522 | 2 |
| 2489 | 1 |
| 2589 | 1 |
| 2522 | 5 |
| 5264 | 2 |
| 1145 | 5 |
| 8884 | 4 |
期望结果(注:推测你这里的258和025是笔误,应该对应原始数据的2589和0256)
| Hier | Number |
|---|---|
| 1 | 2489 |
| 1 | 2589 |
| 1 | 0256 |
| 2 | 2522 |
| 2 | 5264 |
| 4 | 8884 |
| 5 | 1145 |
实现思路
核心逻辑很明确:每个数值只保留它最早出现的层级,后续层级中重复的数值直接剔除。我们可以借助窗口函数来标记每个数值的首次出现位置,再筛选出这些记录即可。
SQL代码实现
下面是通用的SQL写法(适配大多数支持窗口函数的数据库,比如PostgreSQL、MySQL 8+、SQL Server等):
WITH ranked_records AS ( SELECT First AS Number, Second AS Hier, -- 给每个Number按层级从小到大排序,标记首次出现的记录 ROW_NUMBER() OVER (PARTITION BY First ORDER BY Second) AS occurrence_rank FROM your_table_name -- 替换成你的实际表名 ) SELECT Hier, Number FROM ranked_records WHERE occurrence_rank = 1 -- 只保留首次出现的记录 ORDER BY Hier; -- 按层级顺序输出
代码解释
- CTE部分:用
ROW_NUMBER()窗口函数,按First(最终的Number)分组,再按Second(层级)从小到大排序,给每个分组内的记录打上序号。序号为1的就是这个数值最早出现的层级记录。 - 筛选排序:只保留序号为1的记录,再按层级排序,就能得到完全符合需求的结果。
测试这个代码的话,会完美匹配你的要求:
2589最早出现在层级1,所以层级3的那条被排除2522最早出现在层级2,所以层级5的那条被排除5264最早出现在层级2,所以层级4的那条被排除- 其他数值都是首次出现在对应层级,全部保留
内容的提问来源于stack exchange,提问作者Ranjith
相关产品推荐
相关产品推荐

