PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Avere raggruppamenti per clausole — GeneralBits di elein

Alcune persone fanno di tutto per evitare le clausole GROUP BY e HAVING nelle loro query. I messaggi di errore sono pignoli ma di solito sono corretti. Le parole chiave GROUP BY e HAVING sono essenziali per un buon reporting SQL.

Il motivo principale per GROUP BY è ridurre il numero di righe, in genere per aggregazione. Produce solo una riga per ogni raggruppamento corrispondente dall'input. Ciò ti consente di eseguire calcoli sofisticati tramite il normale SQL.

Esempio di frutta:

Abbiamo della frutta:

Questo prossimo caso ci permette di guardare avanti. A metà anno, quali frutti saranno disponibili? Lo facciamo con la stessa query di cui sopra, tuttavia, dopo l'esecuzione della query controlliamo i valori di min(fresh_until) utilizzando una clausola have. HAVING è il modo in cui ti qualifichi un aggregato.

Tutte le mele e l'uva saranno disponibili a metà anno.

L'elenco di elementi tra SELECT e FROM, l'elenco di destinazione. può contenere non aggregati e aggregati. Le colonne non aggregate nell'elenco di destinazione
dovrebbero trovarsi nella clausola group by. Il messaggio di errore lo dice. L'ordine delle colonne nel raggruppamento per clausola è importante. Determina come vengono raggruppati gli aggregati. L'ordine è spesso gerarchico. Ciò che significa per le tue colonne è il tuo obiettivo. Potrebbe essere frutta, o fonti e/o fresco_fino a data.

Esempi di carte da gioco

Diamo un'occhiata a un'altra serie di esempi che illustrano l'estrazione di informazioni sulle carte da gioco. Puoi trovare informazioni sulle carte su Wikipedia Standard Cards.

Supponiamo di distribuire in modo programmatico sei mani da 5 carte, come sei persone che giocano a poker. In questo affare vengono utilizzate un totale di 30 carte. Sono in una mano tabella come la seguente in cui i nomi di carte e semi sono uniti da tabelle di ricerca. Archiviamo i ranghi in modo da poterli ordinare correttamente. Usiamo i nomi per la visualizzazione. I nomi e i gradi hanno una relazione uno a uno per ciascuna delle carte e dei semi.

Qual è il conteggio dei semi per ogni mano? Ci preoccupiamo solo delle mani che hanno 3 o più carte dello stesso seme. Questo ci dirà chi ha maggiori possibilità di un colore del poker. Si noti che sebbene GROUP BY sembri implicare ORDER BY, non è così. ORDER BY deve essere esplicito.

E se avessi raggruppato male la tua query? Se questa mano il tavolo non è raggruppato per handid, quindi otterrai 30 record di 6 mani di 5 carte. Se avessi aggregati, sarebbero raggruppati per riga. Non molto utile.

Se aggreghi il nome della carta e non includi
il nome della carta solo nell'elenco di destinazione e provi a ordinare per nome della carta,
riceverai il messaggio di errore che non dovrebbe essere in
l'ordine per clausola. La clausola order by dovrebbe contenere
elementi della clausola group by.
Tuttavia, se il nome della carta è esplicitamente nell'elenco di destinazione,

quindi il nome della carta deve essere nel gruppo per clausola e
quindi consentito nell'ordine per clausola.

Se la query è per seme, ci sarà un minimo di 1 o un massimo di 4 record per seme per ciascuna delle sei mani. Si noti che stiamo ordinando per rango seme che
deve essere anche nel gruppo per clausola. su_name e su_rank hanno una relazione uno a uno.

Per vedere la distribuzione delle carte nelle mani, dobbiamo raggruppare in base alla colonna del rango delle carte. Ovviamente ci sono 4 semi di ogni carta, quindi non vedrai una carta in più di quattro mani.

Per sbirciare e vedere chi ha gli assi, possiamo usare la seguente breve query. Si noti che esiste una clausola WHERE che viene eseguita durante la raccolta delle righe. HAVING viene eseguito dopo che le righe sono state raccolte.

Riepilogo

Questi esempi sono modi semplici per valutare le entità note. Sperimenta e usa queste semplici regole.

  • Se una colonna è nell'elenco di destinazione e non è un aggregato, deve trovarsi in una clausola GROUP BY.
  • DOVE si verificano clausole durante il processo di selezione.
  • Le clausole HAVING si verificano dopo il completamento degli aggregati.
  • Solo i non aggregati possono essere nella clausola ORDER BY.
  • L'ordine della clausola GROUP BY è importante.