在 SQL 中,根据分组创建对并计算它们的频率
In SQL, create pairs based on a grouping and count their frequency
我想要的是为每个 ID 创建 DISTINCT 对的第 2 列,并按计数排列它们。
让我们以这个 table 为例:
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, 'A', 'a2'),
(3, 'A', 'a3'),
(3, 'C', 'c3'),
(3, 'A', 'a4'),
(4, 'A', 'a1'),
(4, 'B', 'b4'),
(4, 'A', 'a2'),
(4, '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 |
我们可以在 SQL 中使用 GROUP_CONCAT
之类的东西来做这件事吗?
几天来我一直在思考这个问题,但仍然想不出一个简单的解决方案。
谢谢!
您可以self-join并汇总:
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
我认为这是一个 self-join 并且计数不同。一种方法是:
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, t2.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;
我想要的是为每个 ID 创建 DISTINCT 对的第 2 列,并按计数排列它们。
让我们以这个 table 为例:
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, 'A', 'a2'),
(3, 'A', 'a3'),
(3, 'C', 'c3'),
(3, 'A', 'a4'),
(4, 'A', 'a1'),
(4, 'B', 'b4'),
(4, 'A', 'a2'),
(4, '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 |
我们可以在 SQL 中使用 GROUP_CONCAT
之类的东西来做这件事吗?
几天来我一直在思考这个问题,但仍然想不出一个简单的解决方案。
谢谢!
您可以self-join并汇总:
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
我认为这是一个 self-join 并且计数不同。一种方法是:
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, t2.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;