首先,对不起标题是否引起误解,所以我举一个例子。
表格:data_list
列:串行,A1,A2,A3,A4,A5
数据:
381,0,0,0,125,99 537、10002、1234、0、0、0 931,0,0,0,0,0 1213、123、100、0、0、10002 1437,7361,918,17823,0,0 7777、0、0、100、0、1234 7951、125、0、0、918、0 从上面的示例中,我希望结果为:
381 因为串行7951中有重复值125 537 因为序列号1213中有重复值10002 1213 因为序列537中有重复值10002 7777 因为序列号1213中有重复值100 7951 因为存在来自序列号381的重复值125和来自序列号1437的重复值918 值0不算作重复
我尝试了几种逻辑,也从stackoverflow的其他问题中获得了答案。仍然我不知道。
有人可以帮忙吗?谢谢
问题来源于stack overflow
在SQL Server中,我将取消透视并使用窗口函数:
select dl.serial, v.a from (select dl.serial, v.a, count(*) over (partition by v.a) as cnt from data_list dl cross apply (values (dl.a1), (dl.a2), (dl.a3), (dl.a4), (dl.a5) ) v(a) where v.a <> 0 ) dl where cnt > 1; 上面的版本存在返回重复项的风险,serial即使重复项在一行内也是如此。如果有可能,可以轻松对其进行修改。尽管SQL Server不支持count(distinct)作为窗口函数,但使用以下命令很容易模拟dense_rank():
select dl.serial, v.a from (select dl.serial, v.a, (dense_rank() over (partition by v.a order by dl.seral asc) + dense_rank() over (partition by v.a order by dl.seral desc) ) as cnt from data_list dl cross apply (values (dl.a1), (dl.a2), (dl.a3), (dl.a4), (dl.a5) ) v(a) where v.a <> 0 ) dl where cnt > 1;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。