按外键分组并获得新行

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

排序