如何分组输出 2 列中的每个值组合? - SQL
How to output every combination of values in 2 columns, in groups? - SQL
我有一个 table,我希望每个 parent 都映射到每个组中的每个 child。
输入:
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 child。我也尝试使用 CROSS JOIN
但我正在努力获得我想要的输出。提前致谢。
你可以利用一个变量来做到这一点。如果变量的值不为空,则变量将被设置为 child
的值,否则它将复制变量
中包含的值
SET @child := "";
SELECT
group_id,
parent,
IF(child IS NULL, @child, @child := child) AS child
FROM
tab
这里是 fiddle:https://www.db-fiddle.com/f/5KnoFogV19jc4nWa8rrzVx/0。
对你有用吗?
免责声明,我不使用 Redshift,因此可能有更好的选择。但是,CROSS JOIN 应该可以工作。只需获取所有组的 DISTINCT 父值。然后对子值执行相同的操作,并将两个结果合并在一起[=13=]
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
结果:
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 here
我有一个 table,我希望每个 parent 都映射到每个组中的每个 child。
输入:
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 child。我也尝试使用 CROSS JOIN
但我正在努力获得我想要的输出。提前致谢。
你可以利用一个变量来做到这一点。如果变量的值不为空,则变量将被设置为 child
的值,否则它将复制变量
SET @child := "";
SELECT
group_id,
parent,
IF(child IS NULL, @child, @child := child) AS child
FROM
tab
这里是 fiddle:https://www.db-fiddle.com/f/5KnoFogV19jc4nWa8rrzVx/0。
对你有用吗?
免责声明,我不使用 Redshift,因此可能有更好的选择。但是,CROSS JOIN 应该可以工作。只需获取所有组的 DISTINCT 父值。然后对子值执行相同的操作,并将两个结果合并在一起[=13=]
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
结果:
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 here