相交保留两个查询的计数以用于排序目的

Intersect keeping the count from both queries for ordering purpose

我有两个表,我需要对每个表进行 运行 查询。然后需要根据在两个表中找到的名称出现次数对这两个查询的输出进行交叉和排序。

例如:

查询 1:

select * from userA
group by name
order by count(name) desc

---------------------------
ID  |  name  | count(name)
---------------------------
 1  |  John  |  2
 2  |  Mike  |  1
 3  |  Laura |  1
---------------------------

查询 2:

select * from userB
group by name
order by count(name) desc

---------------------------
ID  |  name  | count(name)
---------------------------
 3  |  Laura |  3
 1  |  John  |  1
 5  |  Peter |  1
---------------------------

查询 3:

select * from userA
group by name
order by count(name) desc
intersect
select * from userB
group by name
order by count(name) desc

---------------------------
ID  |  name   | count(name)
---------------------------
 1  |  John   |  1
 3  |  Laura  |  1
---------------------------

问题是相交会重新运行 计数函数,从每个查询中丢弃计数运行。我想看到的是以下输出:

---------------------------
ID  |  name   | count(name)
---------------------------
 3  |  Laura  |  4
 1  |  John   |  3
---------------------------

有谁知道如何做到这一点?

假设您的数据集是这样的:

用户A

id          name      
----------  ----------
1           John      
1           John      
2           Mike      
3           Laura

用户B

id          name      
----------  ----------
1           John      
3           Laura     
3           Laura     
3           Laura     
5           Peter

您可以像这样编写查询以获得所需的结果

select id, name, count(*)
from (
    select id, name, 'A' as source from userA
    union all
    select id, name, 'B' from userB
) t
group by id, name
having count(distinct source) = 2;

结果

id          name        count(*)  
----------  ----------  ----------
1           John        3         
3           Laura       4         

说明

合并数据集,因为您想知道两个表中 John 和 Laura 的合并计数。 Union All 将允许保留两个表中的重复项。合并时,请记住来源。

select id, name, 'A' as source from userA
union all
select id, name, 'B' from userB

上面的查询将合并来自两者的数据并为您提供此结果:

id          name        source    
----------  ----------  ----------
1           John        A         
1           John        A         
2           Mike        A         
3           Laura       A         
1           John        B         
3           Laura       B         
3           Laura       B         
3           Laura       B         
5           Peter       B

现在,让我们提取仅来自两个表的记录。因此,我们按 id 和名称分组并使用 having 子句来提取 count(distinct source) = 2。这意味着,给我有两个来源的记录。劳拉和约翰恰好在两张桌子上。

选择数据时,我们要求count(*)获取id+name组合的记录数。