我有一張表,我希望每個父母都映射到每個組中的每個孩子。
輸入:
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
因此,在每個組中,我希望 inparent中的每個值都映射到child. 如果組中沒有值child,我希望該組完全省略(如圖所示 where group_id= 3)
我最初想GROUP BY 1, 2通過類似的東西來使用和聚合MAX(child),但后來我在我的資料中遇到了可能有> 1個孩子的邊緣情況。我也嘗試過使用CROSS JOIN,但我正在努力獲得我想要的輸出。提前致謝。
uj5u.com熱心網友回復:
免責宣告,我不使用 Redshift,所以可能有更好的選擇。但是,CROSS JOIN 應該可以作業。只需獲取所有組的 DISTINCT 父值。然后對子值執行相同的操作,并將兩個結果連接在一起
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 | 父母 | 孩子 |
|---|---|---|
| 1 | 一種 | 乙 |
| 1 | 乙 | 乙 |
| 2 | C | F |
| 2 | D | F |
| 2 | 乙 | F |
| 2 | C | G |
| 2 | D | G |
| 2 | 乙 | G |
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以利用變數來做到這一點。如果變數的值不為空,則該變數將設定為 的值child,否則將復制該變數中包含的值
SET @child := "";
SELECT
group_id,
parent,
IF(child IS NULL, @child, @child := child) AS child
FROM
tab
這是一個小提琴:https ://www.db-fiddle.com/f/5KnoFogV19jc4nWa8rrzVx/0 。
對你起作用嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/460336.html
上一篇:R:如何使用具有重復值的鍵連接資料幀,并將第二幀的值復制到每個重復項?
下一篇:產生所需輸出的三重連接問題
