按外键分组并获得新行
Group by foreign Key and get new row
我需要统计 table 人的所有外键,如果外键被多次引用,则列出 person_id
。如果我在一个单元格中列出所有 person_id
,这并不复杂。
例如,如果我有这个 table:
PERSON_ID | FOREIGN_KEY
1 a0368dwas
2 b65asd14s
3 b65asd14s
4 a0368dwas
5 cd56as46a
我可以做到 sql 查询:
select listagg(person_id), ', '), foreign_key
from person
group by foreign_key
having count(foreign_key)>1
order by foreign_key
结果如下:
PERSON_ID | FOREIGN_KEY
1,4 z0368dwas
2,3 z65asd14s
我的问题是用户需求,因为他需要 person_id
不是一行,而是每个 person_id
.
所以它必须是这样的:
PERSON_ID | FOREIGN_KEY
1 a0368dwas
4 a0368dwas
2 b65asd14s
3 b65asd14s
这就是分析函数(有点类似于聚合函数,只是它们不会将行折叠成一行)来拯救的地方,特别是 COUNT(*) OVER ()
分析函数:
select person,
foreign_key
from (select person,
foreign_key,
count(*) over (partition by foreign_key) fk_cnt
from person)
where fk_cnt > 1;
此处,"partition by" 子句取代了聚合查询中的 "group by" 子句 - 它定义了分析函数将处理的行集。您必须在子查询中执行分析函数,然后在外部查询中过滤结果,因为还没有等同于分析函数的 "having" 子句。
Select 人,foreign_key
从 (
Select foreign_key 来自 (Select foreign_key , count(1)
从人
按 foreign_key 分组
有 count(1) > 1)
)
按 2
排序
我需要统计 table 人的所有外键,如果外键被多次引用,则列出 person_id
。如果我在一个单元格中列出所有 person_id
,这并不复杂。
例如,如果我有这个 table:
PERSON_ID | FOREIGN_KEY
1 a0368dwas
2 b65asd14s
3 b65asd14s
4 a0368dwas
5 cd56as46a
我可以做到 sql 查询:
select listagg(person_id), ', '), foreign_key
from person
group by foreign_key
having count(foreign_key)>1
order by foreign_key
结果如下:
PERSON_ID | FOREIGN_KEY
1,4 z0368dwas
2,3 z65asd14s
我的问题是用户需求,因为他需要 person_id
不是一行,而是每个 person_id
.
所以它必须是这样的:
PERSON_ID | FOREIGN_KEY
1 a0368dwas
4 a0368dwas
2 b65asd14s
3 b65asd14s
这就是分析函数(有点类似于聚合函数,只是它们不会将行折叠成一行)来拯救的地方,特别是 COUNT(*) OVER ()
分析函数:
select person,
foreign_key
from (select person,
foreign_key,
count(*) over (partition by foreign_key) fk_cnt
from person)
where fk_cnt > 1;
此处,"partition by" 子句取代了聚合查询中的 "group by" 子句 - 它定义了分析函数将处理的行集。您必须在子查询中执行分析函数,然后在外部查询中过滤结果,因为还没有等同于分析函数的 "having" 子句。
Select 人,foreign_key 从 ( Select foreign_key 来自 (Select foreign_key , count(1) 从人 按 foreign_key 分组 有 count(1) > 1) ) 按 2
排序