开发者社区> 问答> 正文

SQL-根据多列中的值获取重复列表

首先,对不起标题是否引起误解,所以我举一个例子。

表格: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

展开
收起
保持可爱mmm 2019-11-18 14:05:14 428 0
1 条回答
写回答
取消 提交回答
  • 在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;

    2019-11-18 14:05:34
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载