我有下面的表格:
create table tablex (fileID int, file varchar(10), name varchar(10));
insert into tablex (fileID, file, name) values (1, 'file1' , 'AAA'),(1, 'file1' , 'AAA'),(1, 'file1' , 'AAA'),(2, 'file2' , 'AAA'),(2, 'file2' , 'AAA'),(2, 'file2' , 'AAA'),(1, 'file1' , 'BBB'),(1, 'file1' , 'BBB'),(2, 'file2' , 'BBB'),(2, 'file2' , 'BBB'),(3, 'file3' , 'BBB'),(3, 'file3' , 'BBB'),(1, 'file1' , 'CCC'),(1, 'file1' , 'CCC');
tablex
fileID | file | name
1 | file1 | AAA
1 | file1 | AAA
1 | file1 | AAA
2 | file2 | AAA
2 | file2 | AAA
2 | file2 | AAA
1 | file1 | BBB
1 | file1 | BBB
2 | file2 | BBB
2 | file2 | BBB
3 | file3 | BBB
3 | file3 | BBB
1 | file1 | CCC
1 | file1 | CCC
我希望只获取出现在多个文件中的名称,然后计算在具有最大id的文件中出现的次数,以及在其他文件中出现的次数。
AAA -文件2中出现3次,其他文件中出现3次
BBB -文件3中出现2次,其他文件中出现4次
我正在尝试使用窗口函数(仍在学习),但不确定这种方法是否是最好的方法,因为我必须添加一个独特的使其工作
select distinct t.name, count(t.name) over (partition by t.name) countAll,
count(t.name) over (partition by t.name, fileId) countLatestFile,
count(t.name) over (partition by t.name) - count(t.name) over (partition by t.name, fileId) countOthers
from tablex t
join (select name from tablex group by name having count(distinct fileId) > 1) tdups
on t.name = tdups.name;
还有其他想法吗
3条答案
按热度按时间vdzxcuhz1#
使用窗口函数
dense_rank
,如下所示:首先使用
cte
根据fileID按等级排列名称。使用cte2(具有最大等级)从每个名称中获取最新文件。然后,我们连接两个CTE以产生所需的结果:
Demo here
ulydmbyx2#
您可以使用max window函数和条件聚合,如下所示:
See demo
zf9nrax13#
不使用窗口函数也能做到的: