如何解决在SQL中,基于分组创建对并计算其频率
我想要为每个ID创建第2列的DISTINCT对,并按计数进行排列。
让我们以该表为例:
CREATE TABLE mytable
(`ID` int,`C2` varchar(1),`C3` varchar(2))
;
INSERT INTO mytable
(`ID`,`C2`,`C3`)
VALUES
(1,'A',' a1'),(1,'B','b1'),(2,'a2'),(3,'a3'),'C','c3'),'a4'),(4,'a1'),'b4'),'D','d1');
对于1,配对为A-B。
对于2,将不存在。
对于3,配对将为A-C。
对于4,对将是A-B,A-D和B-D。
所以输出将是:
| Pair | Cnt |
| A-B | 2 |
| A-C | 1 |
| A-D | 1 |
| B-D | 1 |
我们可以使用GROUP_CONCAT
之类的东西在SQL中做这件事吗?
几天来我一直在解决这个问题,但仍然想不出一个简单的解决方案。
谢谢!
解决方法
我认为这是一种自我结合,并具有独特性。一种方法是:
select t1.c2,t2.c2,count(distinct t1.id) as cnt
from t t1 join
t t2
on t1.id = t2.id and t1.c2 < t2.c2
group by t1.c2,t2.c2
order by cnt desc;
根据您的数据,先删除重复项然后再加入可能会更有效:
with tt as (
select distinct t.id,t.c2
from t
)
select t1.c2,count(t1.id) as cnt
from tt t1 join
tt t2
on t1.id = t2.id and t1.c2 < t2.c2
group by t1.c2,t2.c2
order by cnt desc;
,
您可以自我加入并聚合:
select t1.c2 c21,t2.c2 c22,count(distinct t1.id) cnt
from mytable t1
inner join mytable t2
on t1.id = t2.id
and t1.c2 < t2.c2
group by t1.c2,t2.c2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。