ć ¸ĺżĺ 厚ćčŚ
17c.comďźč§Śĺć°ĺćśäťŁçć°¸ćäšéďźć˘ç´˘ć¨çä¸ĺąĺ¨çşżĺŽĺŽ
čćŻSQLç¨äşçťčŽĄć°ćŽĺćčżç¨ä¸čĄĺ轏ć˘ćŻä¸éĄšĺ¸¸č§çćä˝ă
ć轏ĺćšĺĺĺčĄĺ轏ć˘ĺŻĺ为čĄč˝Źĺăĺ轏čĄć轏ĺĺ 厚ĺĺĺŻĺ为čĄĺ轏ĺ珌串ăĺ珌串轏čĄĺçă
ĺSQLčŻĺĽčŻćłéĺśäź çťçć°ćŽĺşć°ćŽçąťĺĺ¨ĺ¤çčĄĺ轏ć˘ä¸ä¸ĺžćšäžżčŚäščŻĺĽĺéżčŚäščŚĺĺŠĺĺ¨čżç¨ćĽĺŽç°ćçć°ćŽĺşçŽĄççłťçťĺç¨çšĺŽçĺ˝ć°ćĽĺŽç°ă
ĺšśä¸äź çťçćšćłćŻčžă
为äşč§Łĺłčżä¸éŽé˘ä¸é˘ĺŠç¨ä¸äşć°ćŽĺşçŽĄççłťçťĺźĺ Ľçć°çťć°ćŽçąťĺćĽćŻčžćšäžżéŤćĺ°ĺŽćé¨ĺ轏ć˘ĺˇĽä˝ă
ć°ćŽĺĺ¤ć䝏使ç¨ä¸ĺź ĺŚç襨Tä˝ä¸şć䝏çĺşçĄčĄ¨ă
ç¨ĺŽćĽćźç¤şĺç§çąťĺçčĄĺ轏ć˘ćä˝ă
ĺĺŽčĄ¨ä¸ä¸ťéŽćŻĺŚĺˇĺŚćç§çŽă
ć°ćŽĺşçŽĄççłťçťéç¨duckdbĺŽçčŻćłä¸PostgreSQLĺ źĺŽš ă
ĺ¤ç§ĺ˝äş§ć°ćŽĺşäş§ĺäšä¸äšĺ źĺŽšĺŚéäťć°ćŽĺşă
襨
ć睊çťčŽ°čĄ¨âââââââââŹââââââââŹââââââââŹââââââââ â a â b â c â d â â ĺŚĺˇ â ĺŚć â ç§çŽ â ĺć° â âââââââââźââââââââźââââââââźâââââââ⤠â 1 â 1 â 1 â 3 â â 1 â 1 â 2 â 4 â â 1 â 2 â 1 â 4 â â 1 â 2 â 2 â 5 â â 2 â 1 â 1 â 4 â â 2 â 1 â 2 â 5 â â 2 â 2 â 2 â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââçŽĺ辡č§ç¨a,b,c,dĺĺŤčĄ¨ç¤şĺŚĺˇăĺŚćăç§çŽăĺć°ĺťşčĄ¨čŻĺĽĺŚä¸create table t(a smallint,b smallint,c smallint,d smallint, primary key(a,b,c));ćĺ Ľć¨Ąćć°ćŽčŻĺĽa,b,cä¸çćŻä¸Şé˝ĺ
2两个ĺźinsert into t with a(n) as(select 1 union select
select a.n,b.n,c.n,a.nb.nc.n from a,a b,a c;为äşčĄ¨ç¤şćäşć°ćŽçźşĺ¤ąć ĺľĺ°čĄ¨ć źä¸çšĺŽçčĄĺ é¤ă
čŻĺĽĺŚä¸delete from t where (a,b,c)in((2,2,
);
čĄč˝Źĺĺ°ąćŻćĺ¤ä¸ŞčĄćä¸ĺçĺźç¨ĺ¤ä¸ŞĺćĽĺąç¤şă
ĺĺŽć䝏ć3ç§čĄ¨éčŚćžç¤şă
襨
ćĺŚĺˇĺĺŚććžç¤şä¸ĺç§çŽçĺć°ĺŚĺˇ ĺŚć ç§çŽ1ĺć° ç§çŽ2ĺć°čĄ¨
ćĺŚĺˇĺç§çŽćžç¤şä¸ĺĺŚćçĺć°ĺŚĺˇ ç§çŽ ĺŚć1ĺć° ĺŚć2ĺć°čĄ¨
ćĺŚĺˇćžç¤şä¸ĺç§çŽĺĺŚćçĺć°ĺŚĺˇ ç§çŽ1ĺŚć1ĺć° ç§çŽ1ĺŚć2ĺć° ç§çŽ2ĺŚć1ĺć° ç§çŽ2ĺŚć2ĺć°ä¸ 使ç¨case whenčĄč˝Źĺ襨1çćĽčŻ˘čŻĺĽselect a,b,max(case when c1 then d end)c1, max(case when c2 then d end)c2 from t group by a,b; âââââââââŹââââââââŹââââââââŹââââââââ â a â b â c1 â c2 â â ĺŚĺˇ â ĺŚć â ç§çŽ1 â ç§çŽ2 â âââââââââźââââââââźââââââââźâââââââ⤠â 1 â 1 â 3 â 4 â â 1 â 2 â 4 â 5 â â 2 â 1 â 4 â 5 â â 2 â 2 â NULL â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââä¸čż°čŻĺĽçĺŤäšćŻĺ°ćŻç§a,bçťĺä¸çŹŚĺćĄäťśc1ĺc2çdĺźĺĺŤç¨maxćąĺşćŻĺé˝éčŚä¸ä¸Şcase whenčŻĺĽĺŚććžç¤şć个ĺçćĄäťśĺ ĺŤĺ¤ä¸Şĺĺĺ¤ä¸ŞĺçćĄäťśé˝éčŚĺ¨whenä¸ĺĺşă
襨2çćĽčŻ˘čŻĺĽselect a,c,max(case when b1 then d end)b1, max(case when b2 then d end)b2 from t group by a,c; âââââââââŹââââââââŹââââââââŹââââââââ â a â c â b1 â b2 â â ĺŚĺˇ â ç§çŽ â ĺŚć1 â ĺŚć2 â âââââââââźââââââââźââââââââźâââââââ⤠â 1 â 1 â 3 â 4 â â 1 â 2 â 4 â 5 â â 2 â 1 â 4 â NULL â â 2 â 2 â 5 â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââ襨3çćĽčŻ˘čŻĺĽselect a,max(case when b1 and c1 then d end)b1c1, max(case when b1 and c2 then d end)b1c2, max(case when b2 and c1 then d end)b2c1, max(case when b2 and c2 then d end)b2c2 from t group by a; âââââââââŹââââââââŹââââââââŹââââââââŹââââââââ â a â b1c1 â b1c2 â b2c1 â b2c2 â â ĺŚĺˇ â int16 â int16 â int16 â int16 â âââââââââźââââââââźââââââââźââââââââźâââââââ⤠â 1 â 3 â 4 â 4 â 5 â â 2 â 4 â 5 â NULL â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââ´ââââââââäş PostgreSQL使ç¨crosstabčĄč˝Źĺ襨1çćĽčŻ˘čŻĺĽselect a/10 a,a%10 b,c1,c2 from crosstab(select a*10b,c,d from t order by a,b,c,$$VALUES(
,(
$$) as d(a int ,c1 int,c2 int);ĺ śä¸crosstabĺ˝ć°ćŻä¸ä¸ŞćŠĺąĺ˝ć°éčŚç¨ĺ˝äť¤create extension tablefunc;ĺŻç¨ĺŽĺ ĺŤ2个ĺć°ĺć°1ćŻä¸ä¸ŞćĽčŻ˘ĺż éĄťćŻ3ĺĺĺŤćŻčĄĺçťĺăĺĺçťĺăĺĺźĺă
ĺć°2ćŻä¸ä¸ŞćĽčŻ˘ćĺźçĺ襨襨示ĺĺçťĺçĺĺźĺ揥ĺşă
čżéç$$VALUES(
,(
$$ĺŻäťĽç䝡ćżć˘ćselect distinct c from t order by că
asĺĺĽčĄ¨ç¤şĺ°crosstabçčżĺçťć莞罎ä¸ä¸ŞčĄ¨ĺŤĺĺĺŤĺĺçąťĺĺ襨ćĺé˘çselect ĺĺĽçĺĺĺĺźç¨čŞć¤čĄ¨ĺŤĺă
çąäşcrosstabĺŞćŻćä¸ĺä˝ä¸şčĄĺçťĺć䝼ć¤ĺ¤ä˝żç¨äşä¸ä¸Şĺĺšśĺćĺçć掾ĺŚćĺĺźä¸ćŻçŽĺç1ä˝ć´ć°ĺéčŚćšä¸şĺ śäťĺćłă
襨2çćĽčŻ˘čŻĺĽselect a/10 a,a%10 c,b1,b2 from crosstab(select a*10c,b,d from t order by a,c,b,$$VALUES(
,(
$$) as d(a int ,b1 int,b2 int);襨3çćĽčŻ˘čŻĺĽselect a,b1c1,b1c2,b2c1,b2c2 from crosstab(select a,b*10c,d from t order by a,c,b,$$VALUES(
,(
,(
,(
$$) as d(a int , b1c1 int,b1c2 int,b2c1 int,b2c2 int);ä¸ ä˝żç¨ć°çťĺ˝ć°array_aggčĄč˝Źĺ襨1çćĽčŻ˘čŻĺĽwith a(n) as(select 1 union select
,t1 as(select a.n a,b.n b,c.n c from a,a b,a c) select a,b,array_agg(coalesce(d,
order by c)d from t1 left join t using(a,b,c) group by a,b order by 1, 2; âââââââââŹââââââââŹââââââââââ â a â b â d â â int32 â int32 â int16[] â âââââââââźââââââââźâââââââââ⤠â 1 â 1 â [3, 4] â â 1 â 2 â [4, 5] â â 2 â 1 â [4, 5] â â 2 â 2 â [0, 6] â âââââââââ´ââââââââ´ââââââââââčżä¸ŞčŻĺĽçwithé¨ĺçt1襨示a,b,cä¸ĺçĺ ¨çťĺäšĺ°ąćŻçŹĺĄĺ°ç§Żă
coalesceĺ˝ć°čĄ¨ç¤şĺ¨dçĺźä¸şNULLćśĺ°ĺ śćżć˘ć0čĽć éćżć˘ĺĺŻççĽcoalesceĺ˝ć°čžĺşĺ为âââââââââŹââââââââŹââââââââââââ â a â b â d â â int32 â int32 â int16[] â âââââââââźââââââââźâââââââââââ⤠â 1 â 1 â [3, 4] â â 1 â 2 â [4, 5] â â 2 â 1 â [4, 5] â â 2 â 2 â [NULL, 6] â âââââââââ´ââââââââ´ââââââââââââleft join襨示ĺ°ä¸čż°t1ä¸ĺşçĄčĄ¨ĺˇŚčżćĽäšć䝼čżć ˇĺćŻä¸şäşĺ˝ć个ĺŚççźşĺ°ćĺŚććç§çŽć睊ćśč˝ĺ¤ćžç¤ş0ćNULLčä¸čłäşéä˝ă
ĺŚćä¸ĺĺ¨čżç§ć ĺľćŻä¸ŞĺŚçé˝ćĺ ¨é¨çć睊çŽĺĺ°select a,b,array_agg(d order by c)d from t group by a,b order by 1, 2ĺłĺŻă
襨示čĄćšĺća,bĺçťĺćšĺćc饺ĺşĺ丞ă
ĺŚćčŚĺžčĄ¨2ççťćwith a(n) as(select 1 union select
,t1 as(select a.n a,b.n b,c.n c from a,a b,a c) select a,c,array_agg(d order by a,c)d from t1 left join t using(a,b,c)group by a,c order by 1,2; âââââââââŹââââââââŹââââââââââââ â a â c â d â â int32 â int32 â int16[] â âââââââââźââââââââźâââââââââââ⤠â 1 â 1 â [3, 4] â â 1 â 2 â [4, 5] â â 2 â 1 â [4, NULL] â â 2 â 2 â [5, 6] â âââââââââ´ââââââââ´ââââââââââââčĽĺŚçé˝ćĺ ¨é¨çć睊ĺŞéčŚçŽĺĺ°ćšĺĺçťĺćĺşĺselect a,c,array_agg(d order by b)d from t group by a,c order by 1, 2ĺłĺŻă
ĺŚćčŚĺžčĄ¨3ççťćwith a(n) as(select 1 union select
,t1 as(select a.n a,b.n b,c.n c from a,a b,a c) select a,array_agg(d order by b,c)d from t1 left join t using(a,b,c)group by a order by 1; âââââââââŹââââââââââââââââââ â a â d â â int32 â int16[] â âââââââââźâââââââââââââââââ⤠â 1 â [3, 4, 4, 5] â â 2 â [4, 5, NULL, 6] â âââââââââ´ââââââââââââââââââčĽĺŚçé˝ćĺ ¨é¨çć睊ĺŞéčŚĺ°bäťĺçťĺćšä¸şćĺşĺselect a,array_agg(d order by b,c)d from t group by a order by 1ĺłĺŻă
čŚĺ°ć°çťć°ćŽçąťĺä¸çĺ ç´ ĺĺşéç¨ć°çť[ĺşĺˇ]çčŻćłĺşĺˇäť1ĺźĺ§çźĺˇă
ćŻĺŚčŚćä¸čż°čĄ¨3çć°çťçąťĺçťć轏ĺ为ĺ¤ĺçťćčżć ˇçźĺwith a as(select a,array_agg(d order by b,c)d from t group by a)select a,d[1]b1c1,d[2]b1c2,d[3]b2c1,d[4]b2c2 from a; âââââââââŹââââââââŹââââââââŹââââââââŹââââââââ â a â b1c1 â b1c2 â b2c1 â b2c2 â â int16 â int16 â int16 â int16 â int16 â âââââââââźââââââââźââââââââźââââââââźâââââââ⤠â 1 â 3 â 4 â 4 â 5 â â 2 â 4 â 5 â 6 â NULL â âââââââââ´ââââââââ´ââââââââ´ââââââââ´ââââââââĺ 为ćŞä¸ĺ ¨çťĺçčĄ¨ĺ łčä¸čż°çťćçNULLĺ°ąĺçäşéä˝ă
éća2b2c2ççťć奍ĺ¨äşa2b2c1çä˝ç˝Žă
ĺ DuckDB使ç¨pivotčĄč˝ŹĺduckdbčĄĺ轏ć˘ćć´çŽć´çpivotĺunpivotčŻćłĺŚä¸ć示D pivot t on c using sum(d); âââââââââŹââââââââŹâââââââââŹâââââââââ â a â b â 1 â 2 â â int16 â int16 â int128 â int128 â âââââââââźââââââââźâââââââââźââââââââ⤠â 1 â 1 â 3 â 4 â â 1 â 2 â 4 â 5 â â 2 â 1 â 4 â 5 â â 2 â 2 â NULL â 6 â âââââââââ´ââââââââ´âââââââââ´âââââââââ D pivot t on b using sum(d); âââââââââŹââââââââŹâââââââââŹâââââââââ â a â c â 1 â 2 â â int16 â int16 â int128 â int128 â âââââââââźââââââââźâââââââââźââââââââ⤠â 1 â 1 â 3 â 4 â â 1 â 2 â 4 â 5 â â 2 â 1 â 4 â NULL â â 2 â 2 â 5 â 6 â âââââââââ´ââââââââ´âââââââââ´âââââââââ D pivot t on b,c using sum(d); âââââââââŹâââââââââŹâââââââââŹâââââââââŹâââââââââ â a â 1_1 â 1_2 â 2_1 â 2_2 â â int16 â int128 â int128 â int128 â int128 â âââââââââźâââââââââźâââââââââźâââââââââźââââââââ⤠â 1 â 3 â 4 â 4 â 5 â â 2 â 4 â 5 â NULL â 6 â âââââââââ´âââââââââ´âââââââââ´âââââââââ´âââââââââ诌çťç¨ćłĺč§ć楣
ĺ轏čĄĺ轏čĄćŻčĄč˝Źĺçéćä˝ĺ°ąćŻćĺ¤ä¸Şĺçĺźç¨ĺ¤čĄä¸ĺćĽĺąç¤şĺŻšć䝏çäžĺäťčĄ¨
1ă
3ĺžĺ°čĄ¨0ççťćé˝ĺąäşĺ轏čĄă
为ĺĺ°çŻĺš äť ç¨čžĺ¤ćçĺ¤ĺ襨3ćĽĺžĺ°čĄ¨1丞äžĺ śäťĺŻäťĽäťżç §čĄ¨3çĺ¤çćĽĺŽćă
éŚĺ ĺ°čĄ¨3ćĽčŻ˘çťćç¨create table asäżĺ为ć°ćŽĺşčĄ¨T3ă
create table t3 as select a,max(case when b1 and c1 then d end)b1c1, max(case when b1 and c2 then d end)b1c2, max(case when b2 and c1 then d end)b2c1, max(case when b2 and c2 then d end)b2c2 from t group by a;ć厚ććłĺ°çćšćłćŻĺ°ä¸ĺĺçćĽčŻ˘çťćé个ĺĺşĺç¨union allĺĺšśä˝ć¤ćłćĺ¤ĺ°ĺĺ°ąéčŚčŻťĺ¤ĺ°ćŹĄĺ襨ĺ ć¤ĺŻšĺ¤§čĄ¨čč¨ä¸ĺŻčĄă
ä¸ ä˝żç¨case whenĺ轏čĄä˝żç¨case whenĺ轏čĄçĺçćŻéčżä¸ä¸ä¸ŞčĄć°ä¸é轏ć˘ĺć°ç¸ĺćŻčĄé˝ćä¸ä¸ŞčĄĺˇçä¸é´čĄ¨ĺçŹĺĄĺ°ç§Żĺ°ćŻä¸Şĺć ĺ°ĺ°ć个čĄĺˇĺĺ°čĄĺˇä¸ĺĺ§čĄ¨ĺ łčĺ°ĺŻšĺşçĺçťĺčžĺşwith a(n) as(select 1 union select
,t1 as(select row_number()over(order by b,c)rn,b.n b,c.n c from a b,a c) âââââââââŹââââââââŹââââââââ â rn â b â c â â int64 â int32 â int32 â âââââââââźââââââââźâââââââ⤠â 1 â 1 â 1 â â 2 â 1 â 2 â â 3 â 2 â 1 â â 4 â 2 â 2 â âââââââââ´ââââââââ´ââââââââ with a(n) as(select 1 union select
,t1 as(select row_number()over(order by b,c)rn,b.n b,c.n c from a b,a c) select t
a,t
b,t
c,case rn when 1 then b1c1 when 2 then b1c2 when 3 then b2c1 when 4 then b2c2 end d from t1, t3; âââââââââŹââââââââŹââââââââŹââââââââ â a â b â c â d â â int16 â int32 â int32 â int16 â âââââââââźââââââââźââââââââźâââââââ⤠â 1 â 1 â 1 â 3 â â 1 â 1 â 2 â 4 â â 1 â 2 â 1 â 4 â â 1 â 2 â 2 â 5 â â 2 â 1 â 1 â 4 â â 2 â 1 â 2 â 5 â â 2 â 2 â 1 â NULL â â 2 â 2 â 2 â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââäş ä˝żç¨JOIN LATERALĺ轏čĄcrosstabĺŞč˝ĺčĄč˝Źĺćä˝ĺ轏čĄĺŻĺŠç¨PostgreSQLçĺŚä¸ĺč˝JOIN LATERALĺŽćĺŽćŹč´¨ä¸ä¸case whenĺ轏čĄçć衯ä¸č´ä¸čżĺ˝˘ĺźć´ä¸şçŽćă
SELECT t.a, b,c, d FROM t3 t CROSS JOIN LATERAL (VALUES(1,1, t.b1c
,(1,2, t.b1c
,(2,1,t.b2c
,(2,2,t.b2c
) s(b,c, d); âââââââââŹââââââââŹââââââââŹââââââââ â a â b â c â d â â int16 â int32 â int32 â int16 â âââââââââźââââââââźââââââââźâââââââ⤠â 1 â 1 â 1 â 3 â â 1 â 1 â 2 â 4 â â 1 â 2 â 1 â 4 â â 1 â 2 â 2 â 5 â â 2 â 1 â 1 â 4 â â 2 â 1 â 2 â 5 â â 2 â 2 â 1 â NULL â â 2 â 2 â 2 â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââä¸ ä˝żç¨ć°çťĺ轏čĄĺŻšäşĺ¸¸č§ć°ćŽçąťĺççťć襨ĺ轏čĄć°çťć˛Ąćäťäšç¨ă
create table t3a as with a(n) as(select 1 union select
,t1 as(select a.n a,b.n b,c.n c from a,a b,a c)select a,array_agg(d order by b,c)d from t1 left join t using(a,b,c)group by a order by 1; select * from t3a; âââââââââŹââââââââââââââââââ â a â d â â int32 â int16[] â âââââââââźâââââââââââââââââ⤠â 1 â [3, 4, 4, 5] â â 2 â [4, 5, NULL, 6] â âââââââââ´ââââââââââââââââââčŚĺ°ć°çťć°ćŽçąťĺçć°ćŽĺ轏čĄćŻĺŚčŚĺ°ä¸čż°ćačĄč˝Źć°çťĺççťć襨t3ać˘ĺ¤ä¸şĺşçĄčĄ¨ĺŻäťĽĺ°ĺŽä¸b,c两ĺçĺ ¨çťĺčżćĽĺšśäťĽb,c两ĺçťĺçĺşĺˇä¸şä¸ć ĺĺşć°çťĺ ç´ ĺžĺ°ă
ć¤ĺ¤ĺ łéŽćŻčŚćç §ĺć ˇç饺ĺşĺťĺ łčçťć襨ĺĺ ¨çťĺ襨ă
with a(n) as(select 1 union select
,t1 as(select row_number()over(order by b,c)rn,b.n b,c.n c from a b,a c)select a,b,c,d[rn]d from t1,t3a; âââââââââŹââââââââŹââââââââŹââââââââ â a â b â c â d â â int32 â int32 â int32 â int16 â âââââââââźââââââââźââââââââźâââââââ⤠â 1 â 1 â 1 â 3 â â 1 â 1 â 2 â 4 â â 1 â 2 â 1 â 4 â â 1 â 2 â 2 â 5 â â 2 â 1 â 1 â 4 â â 2 â 1 â 2 â 5 â â 2 â 2 â 1 â NULL â â 2 â 2 â 2 â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââć°çťč˝ŹčĄčżĺŻäťĽä˝żç¨unnestĺ˝ć°ĺŽç°ä¸čż°čŻĺĽçç䝡ĺćłĺŚä¸with a(n) as(select 1 union select
,t1 as(select row_number()over(order by b,c)rn,b.n b,c.n c from a b,a c) select t3a.a,t
b,t
c,u.d from t3a,unnest(d) with ordinality as u(d,i),t1 where t
rnu.i order by 1,2,3;čżç§ĺćłç¨ĺžŽč´šč§Łä¸çšĺ¨fromčŻĺĽä¸unnest(d)ĺźç¨çćŻt3a襨çdĺwith ordinality襨示ćĺć°çťçĺćśäş§çĺşĺˇćĺşçĺ ç´ ĺĺ¨čĄ¨ĺŤĺuçdĺĺşĺˇĺĺ¨iĺĺŠç¨čżä¸Şĺşĺˇä¸t1襨ä˝ĺ łčă
ĺ¨čżä¸Şĺşĺä¸ĺŚç¨ć°çťä¸ć çćšćłçŽćă
čĄč˝Źĺ珌串äťäťĽčĄ¨3为äžĺŚćčŚćĺć°ĺç¨ä¸ä¸Şĺ珌串襨示čżéčżä¸é¨ĺ˝ć°string_aggĺŽç°ç¨ćłä¸array_aggĺşćŹä¸č´ĺŞćŻĺ˘ĺ äşä¸ä¸Şĺéĺ珌çĺć°select a,string_agg(d::varchar,, order by b,c)d from t group by a; âââââââââŹââââââââââ â a â d â â int16 â varchar â âââââââââźâââââââââ⤠â 1 â 3,4,4,5 â â 2 â 4,5,6 â âââââââââ´ââââââââââ注ć string_aggĺ˝ć°ĺż˝çĽNULL, ĺŚćčŚĺ¤çNULLéčŚĺĺé˘ä¸ć ˇç¨ĺ ¨çťĺ襨塌čżćĽĺç¨coalesceĺ˝ć°č˝Źć˘ă
with a(n) as(select 1 union select
,t1 as(select a.n a,b.n b,c.n c from a,a b,a c) select a,string_agg(coalesce(d::varchar,NULL),, order by b,c)d from t1 left join t using (a,b,c) group by a order by 1; âââââââââŹâââââââââââââ â a â d â â int32 â varchar â âââââââââźââââââââââââ⤠â 1 â 3,4,4,5 â â 2 â 4,5,NULL,6 â âââââââââ´âââââââââââââ
ĺ珌串轏čĄsplit_partĺ˝ć°ç¨äşĺ°ćĺŽĺé珌çĺ珌串çć个é¨ĺĺĺşĺŽç珏ä¸ä¸Şĺć°ćŻĺ珌串珏äşä¸ŞćŻĺé珌珏ä¸ä¸ŞćŻĺşĺˇç¨intçąťĺă
ĺ°ä¸čż°string_agg轏ć˘ççťćĺ为临ćśčĄ¨ts轏ć˘ä¸şčĄ¨0çćä˝ĺŚä¸with a(n) as(select 1 union select
,t1 as(select row_number()over(order by b,c)rn,b.n b,c.n c from a b,a c) select a,b,c,split_part(d,,,rn::int)d::int from t1 ,ts order by 1,2,3; âââââââââŹââââââââŹââââââââŹââââââââââ â a â b â c â d â â int32 â int32 â int32 â varchar â âââââââââźââââââââźââââââââźâââââââââ⤠â 1 â 1 â 1 â 3 â â 1 â 1 â 2 â 4 â â 1 â 2 â 1 â 4 â â 1 â 2 â 2 â 5 â â 2 â 1 â 1 â 4 â â 2 â 1 â 2 â 5 â â 2 â 2 â 1 â NULL â â 2 â 2 â 2 â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââââčżä¸ŞçťććŻĺĺ§čĄ¨ĺ¤äş1čĄd为NULLçčĄĺŻäťĽç¨where d NULLâčżćť¤ćă
ć°ćŽçąťĺäšä¸ĺŻšĺŻäťĽčżćť¤äšĺĺ轏ć˘ä¸şć´ć°ă
regexp_split_to_table ĺ regexp_split_to_array é˝ćŻĺ珌串ĺĺ˛ĺ˝ć°ĺŻéčżćĺŽç襨螞ĺźčżčĄĺĺ˛ă
regexp_split_to_table ĺ°ĺĺ˛ĺşçć°ćŽč˝ŹćčĄčżä¸Şĺ˝ć°ä¸č˝čžĺşĺşĺˇĺ ć¤äšéžäťĽä¸ĺ¸Śĺşĺˇçĺ śĺŽčĄ¨ĺ łčă
regexp_split_to_array ćŻĺ°ĺéçć°ćŽč˝Źćć°çť,ĺŽĺŻäťĽç¨ä¸ć ćšĺźĺĺşćéçĺ ç´ ĺźă
ä¸čż°split_partćĽčŻ˘çregexp_split_to_arrayçćčŻĺĽĺŚä¸with a(n) as(select 1 union select
,t1 as(select row_number()over(order by b,c)rn,b.n b,c.n c from a b,a c),t2 as(select a,regexp_split_to_array(d,,)d from ts) select a,b,c,d[rn]d from t1 ,t2 order by 1,2,3; âââââââââŹââââââââŹââââââââŹââââââââââ â a â b â c â d â â int32 â int32 â int32 â varchar â âââââââââźââââââââźââââââââźâââââââââ⤠â 1 â 1 â 1 â 3 â â 1 â 1 â 2 â 4 â â 1 â 2 â 1 â 4 â â 1 â 2 â 2 â 5 â â 2 â 1 â 1 â 4 â â 2 â 1 â 2 â 5 â â 2 â 2 â 1 â NULL â â 2 â 2 â 2 â 6 â âââââââââ´ââââââââ´ââââââââ´ââââââââââstring_to_arrayĺ˝ć°çĺč˝ä¸regexp_split_to_arrayç¸ĺă
çťčŽşcase whenéç¨ć§ĺĽ˝éĺäşĺ äšććĺ łçłťĺć°ćŽĺşă
çźşçšćŻĺ˝čžĺşĺčžĺ¤ćśĺćłčżäşĺéżä¸ćçźĺçźĺ塼ä˝ćçčžä˝ă
ć°çťĺ˝ć°array_aggĺcrosstabćŠĺąĺ˝ć°ç¸ćŻĺ ˇćĺŚä¸äźçšĺŻčŻťć§ĺĽ˝ä¸éčŚć ĺşć°ćŽçąťĺă
ĺŻćŠĺąć§ĺĽ˝ĺŻäťĽć¨ĺšżĺ°ĺ¤ä¸Şĺçťä¸éčŚçšćŽĺ¤çă
ĺŻçť´ć¤ć§ĺĽ˝ćšĺĺçťĺŞéčŚćšĺĺçťĺĺćĺşĺă
éç¨ć§čžĺĽ˝ĺ śäťć°ćŽĺşçŽĄççłťçťĺŚduckdbĺŻĺ źĺŽščżç§ĺćłă
使ç¨ć°çťççźşçšćŻĺŽä¸ćŻć ĺć°ćŽçąťĺćäşć°ćŽĺşä¸ćŻćă
ç¨ä¸ć 莿éŽć°çťĺ ç´ ćśä¸ĺć°ćŽĺşçŽĄççłťçťç辡ĺ§ĺźĺŻč˝ä¸ĺĺŚčžćŠçćŹçduckdbçć°çťä¸ć äť0ĺźĺ§čŽĄć°PostgreSQLäť1ĺźĺ§čŽĄć°éčŚćł¨ćă