gpt4 book ai didi

sql - 如何在 SQL 中找到多行匹配项?

转载 作者:行者123 更新时间:2023-12-04 23:45:51 24 4
gpt4 key购买 nike

有下表

CREATE TABLE T1 (
A varchar(2),
B varchar(2)
);

INSERT INTO T1 VALUES
('aa', 'm'), ('aa', 'n'),
('bb', 'n'), ('bb', 'o'),
('cc', 'n'), ('cc', 'o'),
('dd', 'c'), ('dd', 'a'), ('dd', 'r'),
('ee', 'a'), ('ee', 'c'), ('ee', 'r')

A | B
----+----
aa | m
aa | n
bb | n
bb | o
cc | n
cc | o
dd | c
dd | a
dd | r
ee | a
ee | c
ee | r

我如何选择 A 中匹配 B 中所有相应值的值并将其分组。例如,bb 和 cc 组成一个组,因为它们都包含“n”和“o”。

那么结果就是

Group | A
----------
1 | bb
1 | cc
2 | dd
2 | ee

最佳答案

这是一种方法:它首先计算匹配的“集合”,其中一个集合是一组两个匹配的 A。然后它计算“头”,或同一组中集合的最低 A。使用 dense_rank,您可以对头进行编号,然后重新加入集合列表以创建所有集合成员的列表。

查询SE Data .

; with  groups  as
(
select distinct A
from @t
)
, vals as
(
select distinct B
from @t
)
, sets as
(
select g1.A as g1
, g2.A as g2
from groups g1
join groups g2
on g1.A < g2.A
cross join
vals v
left join
@t v1
on g1.A = v1.A
and v.B = v1.B
left join
@t v2
on g2.A = v2.A
and v.B = v2.B
group by
g1.A
, g2.A
having count(case when isnull(v1.B,'') <> isnull(v2.B,'') then 1 end) = 0
)
, heads as
(
select s1.g1
, s1.g2
, head.head
from sets s1
cross apply
(
select min(g1) as head
from sets s2
where s1.g2 = s2.g2
) head
)
select distinct dense_rank() over (order by h.head)
, g.g
from (
select distinct head
from heads
) h
left join
(
select g1 as g
, head
from heads
union all
select g2
, head
from heads
) g
on h.head = g.head

关于sql - 如何在 SQL 中找到多行匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7084232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com