Utilizzo di STRING_AGG per Risultati concisi delle query

La funzione string_agg in SQL è una funzione di aggregazione che concatena (unisce) stringhe da più righe in un’unica stringa con varie opzioni.

È particolarmente utile quando si desidera combinare valori da una colonna per ciascun gruppo di dati nei tuoi report e può rendere il risultato della query più facile da leggere, specialmente quando si gestiscono relazioni molti-a-molti. Ad esempio, se si desidera creare un report che mostri tutti i tag utilizzati in ciascun argomento, è possibile utilizzare string_agg per concatenare tutti i tag per ciascun argomento in un’unica stringa.

Sintassi

Ecco la sintassi di base di string_agg:

STRING_AGG(espressione, delimitatore)

La funzione string_agg accetta due parametri:

  • espressione: Il valore da concatenare.
  • delimitatore: Il delimitatore da inserire tra le stringhe. Il delimitatore può essere una stringa o un carattere.

Esempio di utilizzo nelle query DE

Diamo un’occhiata ad alcuni esempi di query che utilizzano string_agg

Elenca tutte le categorie su un sito

Questa query concatena i campi name e id dalla tabella categories in un’unica stringa, con ogni coppia name e id separata da ’ : ', e ogni coppia separata da ', '. Le coppie sono quindi ordinate per id.

SELECT  
    -- La funzione STRING_AGG concatena i campi 'name' e 'id' in un'unica stringa.
    -- Ogni coppia 'name' e 'id' è separata da ' : ', e ogni coppia è separata da ', '.
    -- Le coppie sono ordinate per 'id'.
    STRING_AGG(name || ' : ' || id, ', ' ORDER BY id) AS category_list
FROM 
    categories -- I dati vengono selezionati dalla tabella 'categories'.

Esempio di risultati:

category_list
Non categorizzato : 1, Feedback sito : 2, Staff : 3, Lounge : 4, Email : 5, Evento : 6, Categoria padre : 7, Sottocategoria

Elenca tutti gli argomenti e i tag associati

Questa query seleziona l’id dalla tabella topics e concatena i tags associati per ciascun argomento in un’unica stringa. Ogni tag è separato da una virgola e uno spazio, e i tag sono ordinati alfabeticamente. Il risultato è raggruppato per l’id dell’argomento e ordinato per tag. Se un argomento non ha tag, la colonna tags sarà NULL

SELECT t.id topic_id,
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
FROM topics t
LEFT JOIN topic_tags tt ON tt.topic_id = t.id
LEFT JOIN tags ON tags.id = tt.tag_id
GROUP BY t.id   
ORDER BY tags

Il risultato sarà un elenco di ID argomento formattati, ciascuno con una stringa di tag associati ordinati alfabeticamente. Ad esempio:

Esempio di risultati:

topic tags
Benvenuto nella Lounge (3) tag1, tag2
Un post molto sicuro per il lavoro (3) tag3, tag4, tag,5
Questo è un post di blog (4) tag3
Informazioni sulla categoria Lounge (3) tag5
Benvenuto nella tua prova standard di 14 giorni! NULL
Spiegazione dettagliata con commenti inline
-- Questa istruzione SQL seleziona dati dalla tabella 'topics' e dai 'tags' associati.
SELECT 
    t.id topic_id, -- Seleziona l''id' dalla tabella 'topics'.
    -- La funzione STRING_AGG concatena i 'tags' associati per ciascun argomento in un'unica stringa.
    -- Ogni tag è separato da una virgola e uno spazio, e i tag sono ordinati alfabeticamente.
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
FROM 
    topics t -- I dati vengono selezionati dalla tabella 'topics'.
    -- La tabella 'topic_tags' viene unita a sinistra in base a 'topic_id' dalla tabella 'topics'.
    LEFT JOIN topic_tags tt ON tt.topic_id = t.id
    -- La tabella 'tags' viene unita a sinistra in base a 'tag_id' dalla tabella 'topic_tags'.
    LEFT JOIN tags ON tags.id = tt.tag_id
GROUP BY 
    t.id -- Il risultato è raggruppato per l''id' dell'argomento.
ORDER BY
    "tags" -- Il risultato è ordinato per 'tags'.

Utenti che hanno postato negli argomenti

Questa query restituirà un elenco di id e titoli di topic, gli username degli utenti che hanno postato in ciascun argomento e il conteggio di utenti distinti che hanno postato in ciascun argomento. I risultati sono quindi ordinati per conteggio utenti, in ordine decrescente.

SELECT
    topics.id AS "topic_id",
    topics.title AS "topic_title",
    STRING_AGG(DISTINCT users.username, ', ' ORDER BY users.username) AS "users_posted",
    COUNT(DISTINCT users.id) AS "user_count"
FROM
    topics
JOIN
    posts ON posts.topic_id = topics.id
JOIN
    users ON users.id = posts.user_id
GROUP BY
    topics.id, topics.title
ORDER BY
    "user_count" DESC

Esempio di risultati

topic topic_title users_posted user_count
Creiamo un argomento (10) Creiamo un argomento anonimo, utente1, utente2, utente3 4
Altro argomento (3) Altro argomento utente3, utente4, utente5 3
Test Discobot (2) Test Discobot utente6 1
Spiegazione dettagliata con commenti inline
-- Questa istruzione SQL seleziona dati dalle tabelle 'topics', 'posts' e 'users'.
SELECT
    topics.id AS "topic_id", -- Seleziona l''id' dalla tabella 'topics'.
    topics.title AS "topic_title", -- Seleziona il 'title' dalla tabella 'topics'.
    -- La funzione STRING_AGG concatena gli username degli utenti che hanno postato nell'argomento in un'unica stringa.
    -- Ogni username è separato da una virgola e uno spazio, e gli username sono ordinati alfabeticamente.
    STRING_AGG(DISTINCT users.username, ', ' ORDER BY users.username) AS "users_posted",
    -- Conta il numero di utenti distinti che hanno postato nell'argomento.
    COUNT(DISTINCT users.id) AS "user_count"
FROM
    topics -- I dati vengono selezionati dalla tabella 'topics'.
    -- La tabella 'posts' viene unita in base a 'topic_id' dalla tabella 'topics'.
    JOIN posts ON posts.topic_id = topics.id
    -- La tabella 'users' viene unita in base a 'id' dalla tabella 'posts'.
    JOIN users ON users.id = posts.user_id
GROUP BY
    topics.id, topics.title -- Il risultato è raggruppato per l''id' e 'title' dell'argomento.
ORDER BY
    "user_count" DESC -- Il risultato è ordinato per numero di utenti, in ordine decrescente.

Questo è tutto per questo tutorial!

Se hai domande o esempi su come hai utilizzato string_agg, non esitare a condividerli qui sotto. :slightly_smiling_face:

6 Mi Piace