問候:)
這可能是一個簡單的雪花問題,但我正在努力解決這個問題。
我想將同一列中的不同值收集到一個輸出中。為了給你更多的背景資訊,我正在一個客戶表中作業,并且該客戶使用 2 個手機號碼注冊,以便在輸出中給我兩次相同的客戶,但每條記錄都有不同的電話號碼(以及在同一列中的那些號碼)我們的資料庫)所以,我只想獲取一條記錄并將這兩個數字收集在同一列中。
我正在做分析,所以只是從資料庫中讀取我沒有在這里改變任何東西。
先感謝您 :)
---- 更多說明:我不能使用 listagg() 因為數字存盤在同一列中,我的目標是將它們收集到單個輸出中:)
uj5u.com熱心網友回復:
所以把它剝離下來,我有一張桌子customer_id和phone
像這樣:
SELECT
customer_id,
phone
FROM VALUES
(123, '555-1234-999'),
(123, '555-5555-999'),
(678, '555-6162-999')
v(customer_id, phone);
給你很多行:
| 客戶ID | 電話 |
|---|---|
| 123 | 555-1234-999 |
| 123 | 555-5555-999 |
| 678 | 555-6162-999 |
我們可以偷懶(對我來說)并將它變成一個陣列:
SELECT
customer_id,
ARRAY_AGG(phone) as phones
FROM VALUES
(123, '555-1234-999'),
(123, '555-5555-999'),
(678, '555-6162-999')
v(customer_id, phone)
GROUP BY 1
ORDER BY 1;
這使:
| 客戶ID | 電話 |
|---|---|
| 123 | [“555-1234-999”、“555-5555-999”] |
| 678 | [“555-6162-999”] |
稍微多一點可能是添加一個 WITHIN GROUP 子句來訂購這些電話:
SELECT
customer_id,
ARRAY_AGG(phone) WITHIN GROUP (ORDER BY phone) as phones
FROM VALUES
(123, '555-1234-999'),
(123, '555-5555-999'),
(678, '555-6162-999')
v(customer_id, phone)
GROUP BY 1
ORDER BY 1;
您可以通過不同的列訂購,這里我添加了一個假帳號,運氣:
SELECT
customer_id,
ARRAY_AGG(phone) WITHIN GROUP (ORDER BY account) as phones
FROM VALUES
(123, '555-1234-999',2),
(123, '555-5555-999',1),
(678, '555-6162-999',1)
v(customer_id, phone, account)
GROUP BY 1
ORDER BY 1;
或者我們可以在知道“每個客戶只有 2 個電話”的情況下進行自我 LEFT JOIN
WITH data AS (
SELECT *
FROM VALUES
(123, '555-1234-999',2),
(123, '555-5555-999',1),
(678, '555-6162-999',1)
v(customer_id, phone, account)
)
SELECT
a.customer_id,
a.phone,
b.phone
FROM data AS a
LEFT JOIN data AS b
ON a.customer_id = b.customer_id and a.account = 1 and b.account = 2
ORDER BY 1;
這使:
| 客戶ID | 電話 | 電話 |
|---|---|---|
| 123 | 555-1234-999 | |
| 123 | 555-5555-999 | 555-1234-999 |
| 678 | 555-6162-999 |
Righto,所以不需要多連接,很好,因為它很難看。
不知道為什么不能使用 LIST_AGG ,因為您可以將標記包裝在一個模式中,然后對其進行分隔。但實際上 ARRAY_AGG 更好。
SELECT
customer_id,
LISTAGG('"'|| phone ||'"',',' ) as phones
FROM VALUES
(123, '555-1234-999'),
(123, '555-5555-999'),
(678, '555-6162-999')
v(customer_id, phone)
GROUP BY 1
ORDER BY 1;
給出:
| 客戶ID | 電話 |
|---|---|
| 123 | "555-1234-999","555-5555-999" |
| 678 | “555-6162-999” |
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/422017.html
標籤:
