Oracle SQL中按自定义规则实现唯一行筛选的可行性问询
Oracle SQL实现指定筛选需求
完全可以用Oracle SQL实现这个筛选需求,借助窗口函数就能轻松达成。
现有数据表TableA
| Row_No | COL1 | COL2 | COL3 | COL4 |
|---|---|---|---|---|
| 1 | 1234 | SER1 | Y | ABC |
| 2 | 1234 | SER2 | N | DEF |
| 3 | 3456 | SER1 | Y | XYZ |
| 4 | 3456 | SER2 | Y | PQR |
| 5 | 5678 | SER1 | N | QAZ |
| 6 | 5678 | SER2 | N | SRT |
期望结果集
| Row_No | COL1 | COL2 | COL3 | COL4 |
|---|---|---|---|---|
| 1 | 1234 | SER1 | Y | ABC |
| 3 | 3456 | SER1 | Y | XYZ |
| 5 | 5678 | SER1 | N | QAZ |
实现SQL语句
SELECT t.Row_No, t.COL1, t.COL2, t.COL3, t.COL4 FROM ( SELECT a.*, ROW_NUMBER() OVER ( PARTITION BY a.COL1 ORDER BY a.COL3 DESC, a.Row_No ASC ) AS rn FROM TableA a ) t WHERE t.rn = 1;
逻辑说明
- 内层查询使用
ROW_NUMBER()窗口函数,按COL1分组(PARTITION BY a.COL1),每组内先按COL3降序排序(确保COL3='Y'的行优先级更高,字符Y的ASCII码大于N,降序后Y排在前面),再按Row_No升序排序(同COL3值时选择行号更小的记录)。 - 外层查询筛选出每组中行号为1的记录(
t.rn = 1),就是每组符合筛选规则的目标行。
内容的提问来源于stack exchange,提问作者net user
相关产品推荐
相关产品推荐

