我有一个表,我希望每个家长都映射到每个组中的每个子元素.

输入:

group_id     parent     child
1            A          E
1            B    
2            C          F
2            D
2            E          G      
3            X
3            Y

输出:

group_id     parent     child
1            A          E
1            B          E
2            C          F
2            D          F
2            E          F      
2            C          G
2            D          G
2            E          G  

所以在每个组中,我希望parent中的每个值映射到child中的每个值.如果child中没有一个组的值,我希望完全忽略该组(如图所示,其中group_id=3)

我最初打算使用GROUP BY 1, 2,然后用MAX(child)之类的数据进行聚合,但后来我在数据中遇到了一些边缘情况,其中可能有>1个子元素.我也try 过使用CROSS JOIN,但我很难得到我想要的输出.提前谢谢.

推荐答案

免责声明,我不使用红移,所以可能有更好的 Select .然而,交叉连接应该有效.只需获取所有组的不同父值.然后对子值执行同样的操作,并将两个结果合并在一起

SELECT  p.group_id, p.parent, c.child
FROM   ( 
           SELECT group_id, parent
           FROM   YourTable
           GROUP BY group_id, parent
       ) 
       p CROSS JOIN 
       (
           SELECT group_id, child
           FROM   YourTable
           WHERE  child IS NOT NULL
           GROUP BY group_id, child       
       )
       c 
WHERE  p.group_id = c.group_id
ORDER BY p.group_id, c.child, p.parent

Results:

group_id parent child
1 A E
1 B E
2 C F
2 D F
2 E F
2 C G
2 D G
2 E G

db<>fiddle 100

Sql相关问答推荐

Select 最大值,但当并列时,从其他列 Select 最大值

对非RUST源代码字符串使用`stringify!`,例如SQL查询

计算周时出现SQL错误结果

如何在SQL Server中拆分包含字符和数字的列?

DBeaver将过程中的属性列表转换为字符串

将Dense_RANK列为聚合(非解析)函数(&A)

如何在presto中映射id与名称

每小时 Select 1行

在Netezza SQL中将字符DataType转换为整型DataType

通过UPDATE SELECT更新表时出现问题

不同计数的 Postgres PIVOT 表

Postgresql - 如何根据阈值计算累积和

清理 XML 数据

SQL 将 Varchar 转换为日期

有没有办法在雅典娜中将字符串转换为 int ?

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

获取记录的上一个值,并将其与当前值一起显示

根据开始时间和结束时间计算has_impact字段

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

在 MS Access 中连接相关记录