SQL Academy · Lektion

UNNEST og aggregering

Omdan arrays til rækker og tilbage igen.

Lektion 3 af 413 trin

UNNEST og aggregering er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad er UNNEST

PostgreSQL lader dig gemme arrays i en enkelt kolonne. Men nogle gange har du brug for at arbejde med hvert element individuelt — det er her, UNNEST kommer ind i billedet.

UNNEST er en funktion, der returnerer et sæt rækker og udvider et array til én række pr. element. Tænk på det som det modsatte af aggregering: I stedet for at samle mange rækker i én udvider den én værdi til mange rækker.

Grundlæggende UNNEST-eksempel

Den enkleste anvendelse af UNNEST er at sende en array-literal direkte ind. Hvert element bliver sin egen række i resultatsættet.

Her udvider vi et almindeligt array med heltal til individuelle rækker:

SELECT UNNEST(ARRAY[10, 20, 30, 40]) AS value;

UNNEST med tekst-arrays

UNNEST fungerer med alle array-typer, herunder tekst. Det er nyttigt, når du har en kolonne, der gemmer mærkater, kategorier eller data i stil med kommaseparerede værdier, kodet som et PostgreSQL-array.

SELECT UNNEST(ARRAY['apple', 'banana', 'cherry']) AS fruit;

UNNEST fra en tabelkolonne

UNNEST's virkelige styrke viser sig, når du bruger den på en faktisk tabelkolonne. Hver række i tabellen kan have et array med forskellig længde, og UNNEST udvider dem alle til individuelle rækker.

I dette eksempel har en products-tabel en tags-kolonne med tekst-arrays:

CREATE TABLE products (
  id   SERIAL PRIMARY KEY,
  name TEXT,
  tags TEXT[]
);

INSERT INTO products (name, tags) VALUES
  ('Laptop',  ARRAY['electronics', 'computing', 'portable']),
  ('Shirt',   ARRAY['clothing', 'casual']),
  ('Blender', ARRAY['kitchen', 'electronics']);

SELECT name, UNNEST(tags) AS tag
FROM products;

Optælling af forekomster af mærkater

Når du har udfoldet en array-kolonne, kan du behandle resultaterne som alle andre rækker og anvende aggregatfunktioner. Her tæller vi, hvor mange produkter der er knyttet til hvert mærkat.

Mønsteret er: UNNEST i en underforespørgsel eller CTE, derefter GROUP BY den udfoldede værdi:

SELECT tag, COUNT(*) AS product_count
FROM (
  SELECT UNNEST(tags) AS tag
  FROM products
) AS expanded
GROUP BY tag
ORDER BY product_count DESC;

UNNEST med ordinalsangivelse

Nogle gange har et elements placering i arrayet betydning. PostgreSQL tilbyder WITH ORDINALITY til at knytte et rækkenummer til hvert udfoldet element, så du kender dets oprindelige indeks i arrayet (1-baseret).

SELECT val, pos
FROM UNNEST(ARRAY['first', 'second', 'third']) WITH ORDINALITY AS t(val, pos);

Brug af ordinalsangivelse i en tabel

WITH ORDINALITY er især nyttigt, når du gemmer ordnede lister i et array. Det kan for eksempel være en tabel over afspilningslister, hvor rækkefølgen af spor er vigtig:

CREATE TABLE playlists (
  id     SERIAL PRIMARY KEY,
  title  TEXT,
  tracks TEXT[]
);

INSERT INTO playlists (title, tracks) VALUES
  ('Morning Mix', ARRAY['Song A', 'Song B', 'Song C']);

SELECT p.title, track, position
FROM playlists p,
     UNNEST(p.tracks) WITH ORDINALITY AS t(track, position)
ORDER BY p.id, position;

Filtrering efter UNNEST

Da UNNEST omdanner array-elementer til rækker, kan du filtrere dem med en normal WHERE-betingelse. Det gør det muligt at finde alle rækker, hvis array indeholder en bestemt værdi, uden at bruge operatoren for array-indeholdelse.

SELECT DISTINCT name
FROM products,
     UNNEST(tags) AS tag
WHERE tag = 'electronics';

Aggregering tilbage til et array

Den omvendte operation af UNNEST er ARRAY_AGG. Efter at have udfoldet rækker og transformeret eller filtreret dem kan du samle resultaterne i et array igen. Dette mønster — udfold, behandl, aggreger igen — er et almindeligt PostgreSQL-mønster.

SELECT ARRAY_AGG(tag ORDER BY tag) AS sorted_tags
FROM (
  SELECT UNNEST(ARRAY['cherry', 'apple', 'banana']) AS tag
) AS t;

Fjernelse af dubletter i arrays

En praktisk anvendelse af rundturen fra array til aggregat og tilbage igen er at fjerne dubletter fra et array. Udfør UNNEST på arrayet, anvend DISTINCT, og saml derefter elementerne igen med ARRAY_AGG:

SELECT ARRAY_AGG(DISTINCT tag ORDER BY tag) AS unique_tags
FROM UNNEST(ARRAY['sql', 'database', 'sql', 'postgresql', 'database']) AS tag;

Kombination af flere arraykolonner

Du kan udføre UNNEST på flere arrays parallelt i FROM-klausulen. PostgreSQL parrer elementerne efter position. Hvis arrays har forskellig længde, producerer det kortere array NULL-værdier for de ekstra positioner i det længere array.

SELECT key, value
FROM UNNEST(
  ARRAY['name',    'city',      'role'],
  ARRAY['Alice',   'Istanbul',  'DBA']
) AS t(key, value);

Test din viden

Test din forståelse af UNNEST og aggregering af arrays i PostgreSQL.

Opsummering af lektionen

I denne lektion har du lært, hvordan du kan omdanne arrays til rækker og tilbage igen ved hjælp af PostgreSQLs indbyggede funktioner:

  • UNNEST — udvider et array til én række pr. element og fungerer både med litteraler og tabelkolonner.
  • WITH ORDINALITY — tilføjer et positionsindeks til hvert element efter UNNEST, så du kender den oprindelige rækkefølge i arrayet.
  • Filtrering — efter UNNEST kan du bruge WHERE ligesom på alle almindelige rækker.
  • ARRAY_AGG — det omvendte af UNNEST; samler rækker tilbage i et array, eventuelt med ORDER BY eller DISTINCT.
  • Parallel UNNEST — flere arrays i FROM-klausulen udvides side om side og parres efter position.

Når du mestrer dette mønster med at udvide, behandle og aggregere igen, kan du håndtere arraydata med hele SQL's udtrykskraft.

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “UNNEST og aggregering” gratis?

Ja — hele teksten til “UNNEST og aggregering” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “UNNEST og aggregering”?

Omdan arrays til rækker og tilbage igen. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “UNNEST og aggregering”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grundlæggende array-kolonner
  2. Søgning i arrays
  3. UNNEST og aggregering
  4. Arrays kontra normaliserede tabeller
← Tilbage til SQL Academy