我正在處理一個相當奇怪的場景,在這個場景中,我必須補償一個排序不太好的客戶資料庫。資料(以下示例)涉及一些具有主序列號 (serial) 和 0 到 4 個附加備用序列號 (alt_serial) 的產品。不幸的是,這些列都不是主鍵,并且每個備用序列號都會產生一個與第一列重復的額外行。
test_table:
id | serial | type | alt_serial
---- ------------ ---------------- -----------------
0 | XL00007 | AA | XL700001
1 | XL00007 | AB | XL700002
2 | MARF665 | AC | XTRA0001
3 | MARF665 | AD | XTRA0002
4 | MARF665 | AE | XTRA0003
5 | GLOMP12 | AF | GLOMPX01
6 | GLOMP12 | AG | GLOMPX02
7 | GLOMP12 | AH | GLOMPX03
8 | SLONK15 | AI | SLONKX01
9 | SLONK15 | AJ | SLONKX02
目標是產生一個單一的查詢(聯合是好的),基本上將這個資料扁平化為每個主序列的一行,而備用序列的內容被壓縮(例如使用 CONCAT)成一個列中的字串。例如,給定上表,此查詢的理想結果將是:
serial | alt_serials
------------ -----------------------------------------------------
XL00007 | XL700001|XL700002
MARF665 | XTRA0001|XTRA0002|XTRA0003
GLOMP12 | GLOMPX01|GLOMPX02|GLOMPX03
SLONK15 | SLONKX01|SLONKX02
我意識到這里的理想解決方案是修復格式不佳的表格。不幸的是,我沒有任何型別的訪問或修改資料的權限——我堅持現有的表沒有改變。由于特定于此實作的原因,我也無法創建其他資料庫或表。
我不是 DBA,但我涉足 SQL。我嘗試了幾種方法,但是當我嘗試解釋這些資料時,查詢的復雜性很快就會爆炸,我想還有更好的方法。與其發布我提出的任何不成功的嘗試,我想問 Stack Overflow 的 SQL 專家:如果您被這些不幸的資料所困擾,您將如何解決這個問題?
uj5u.com熱心網友回復:
- 您可以使用該
string_agg
函式將它們全部連接成 1
select
serial,
string_agg(alt_serial,',') as all_serials
from test_table
group by 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529780.html
上一篇:PHP:如何用多個選擇表沖刺?
下一篇:別人的SQL陳述句