如何解决使用 case 语句进行重复处理
我有一个表格 tab1。情况 1:如果没有重复,则显示 col1 数据。情况 2:如果我在 col1 中发现重复,则应考虑 sr_no 的最大值。在考虑这一点时,我只需要考虑 data='xyz' 其他应该被忽略的。
Tab1 结构(不完全是)Col1 Sr 数据
你能帮我查询一下吗?尝试使用 case 条件但未获得所需的输出。
例如
Col1. Sr. Data.
1234. 1. ABC
1234. 2. MNO
1234. 3. XYZ
1234. 4. ABC
2345. 1. ABC
输出
Col1. Sr. Data
1234. 3. XYZ (as it is duplicated,select max of sr and data=XYZ)
2345. 1. ABC (As it is unique no checks for max and data=XYZ)
解决方法
我认为您希望 row_number()
优先于 XYZ
:
select t.*
from (select t.*,row_number() over (partition by col1 order by (case when data = 'XYZ' then 1 else 2 end),sr desc) as seqnum
from t
) t
where seqnum = 1;
,
你的逻辑似乎是:
SELECT Col1,Sr,Data
FROM (
SELECT t.*,CASE max_cnt
WHEN 1
THEN 1
ELSE ROW_NUMBER() OVER ( PARTITION BY Col1 ORDER BY Sr DESC )
END AS rn
FROM (
SELECT t.*,MAX( cnt ) OVER ( PARTITION BY Col1 ) AS max_cnt
FROM (
SELECT t.*,COUNT(*) OVER ( PARTITION BY Col1,Data ) AS cnt
FROM table_name t
) t
) t
WHERE max_cnt = 1
OR data = 'XYZ'
)
WHERE rn = 1;
对于样本数据:
CREATE TABLE table_name ( Col1,Data ) AS
SELECT 1234,1,'ABC' FROM DUAL UNION ALL
SELECT 1234,2,'MNO' FROM DUAL UNION ALL
SELECT 1234,3,'XYZ' FROM DUAL UNION ALL
SELECT 1234,4,'ABC' FROM DUAL UNION ALL
SELECT 2345,'ABC' FROM DUAL;
输出:
COL1 | SR | 数据 |
---|---|---|
1234 | 3 | XYZ |
2345 | 1 | ABC |
dbfiddle here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。