Svar på det oprindelige spørgsmål
Postgres tillader sæt-retur-funktioner (SRF) til at multiplicere rækker. generate_series() er din ven:
INSERT INTO b (all_names, birthday)
SELECT names, current_date -- AS birthday ??
FROM (SELECT names, generate_series(1, number) FROM a);
Siden introduktionen af LATERAL i Postgres 9.3 Du kan godt holde dig til standard SQL:SRF flytter fra SELECT til FROM liste:
INSERT INTO b (all_names, birthday)
SELECT a.names, current_date -- AS birthday ??
FROM a, generate_series(1, a.number) AS rn
LATERAL er implicit her, som forklaret i manualen:
LATERAL kan også gå forud for et funktionskald FROM element, men i dette tilfælde er det et støjord, fordi funktionsudtrykket under alle omstændigheder kan henvise til tidligere FRA elementer.
Omvendt funktion
Ovenstående er den omvendte operation (ca.) af en simpel aggregeret count() :
INSERT INTO a (name, number)
SELECT all_names, count(*)
FROM b
GROUP BY 1;
... som passer til dit opdaterede spørgsmål.
Bemærk en subtil forskel mellem count(*) og count(all_names) . Førstnævnte tæller alle rækker, uanset hvad, mens sidstnævnte kun tæller rækker, hvor all_names IS NOT NULL . Hvis din kolonne all_names er defineret som NOT NULL , begge returnerer det samme, men count(*) er lidt kortere og hurtigere.
Om GROUP BY 1 :
- GROUP BY + CASE-udsagn