元の質問への回答
Postgresを使用すると、set-returning関数(SRF)で行を増やすことができます。 generate_series() あなたの友達です:
INSERT INTO b (all_names, birthday)
SELECT names, current_date -- AS birthday ??
FROM (SELECT names, generate_series(1, number) FROM a);
LATERALの導入以来 Postgres9.3で 標準SQLに固執することができます:SRFはSELECTから移動します FROMへ リスト:
INSERT INTO b (all_names, birthday)
SELECT a.names, current_date -- AS birthday ??
FROM a, generate_series(1, a.number) AS rn
LATERAL マニュアルで説明されているように、ここでは暗黙的です:
LATERAL関数呼び出しの前にFROMを付けることもできます アイテムですが、この場合、関数式はどのような場合でも以前のFROMアイテムを参照できるため、これはノイズワードです。
逆操作
上記は、単純な集計count()の(おおよその)逆の操作です。 :
INSERT INTO a (name, number)
SELECT all_names, count(*)
FROM b
GROUP BY 1;
...更新された質問に適合します。
count(*)の微妙な違いに注意してください およびcount(all_names) 。前者は何があってもすべての行をカウントしますが、後者はall_names IS NOT NULLの行のみをカウントします 。列がall_namesの場合 NOT NULLとして定義されています 、どちらも同じものを返しますが、count(*) 少し短くて速いです。
GROUP BY 1について :
- GROUP BY+CASEステートメント