sql >> Database >  >> RDS >> PostgreSQL

Groeperen op clausules - elein's GeneralBits

Sommige mensen doen er alles aan om GROUP BY- en HAVING-clausules in hun zoekopdrachten te vermijden. De foutmeldingen zijn kieskeurig, maar ze hebben meestal gelijk. GROUP BY en HAVING sleutelwoorden zijn essentieel voor goede SQL-rapportage.

De belangrijkste reden voor GROUP BY is om het aantal rijen te verminderen, meestal door aggregatie. Het produceert slechts één rij voor elke overeenkomende groepering van de invoer. Hierdoor kunt u geavanceerde berekeningen maken via gewone SQL.

Vruchtenvoorbeeld:

We hebben wat fruit:

Dit volgende geval stelt ons in staat vooruit te kijken. Welk fruit zal halverwege het jaar beschikbaar zijn? We doen dit met dezelfde query als hierboven, maar nadat de query is uitgevoerd, controleren we de waarden van min(fresh_until) met behulp van een hebbende clausule. HEBBEN is hoe je een aggregaat kwalificeert.

Alle appels en druiven zullen halverwege het jaar beschikbaar zijn.

De lijst met items tussen SELECT en FROM, de doellijst. kan niet-aggregaten en aggregaten bevatten. Die niet-geaggregeerde kolommen in de doellijst
moeten in de group by-clausule staan. De foutmelding zegt het. De volgorde van de kolommen in de groep op clausule is van belang. Het bepaalt hoe de aggregaten worden gegroepeerd. De volgorde is vaak hiërarchisch. Wat dat voor uw kolommen betekent, is uw focus. Het kan fruit zijn, of bronnen en/of fresh_until date.

Voorbeelden van speelkaarten

Laten we eens kijken naar een andere reeks voorbeelden die het extraheren van informatie over speelkaarten illustreren. Je kunt meer te weten komen over kaarten op Wikipedia Standard Cards.

Stel dat u programmatisch zes handen van vijf kaarten uitdeelt, zoals zes mensen die poker spelen. In deze deal worden in totaal 30 kaarten gebruikt. Ze zijn in een hand tabel zoals de volgende waar de namen van kaarten en kleuren worden samengevoegd door opzoektabellen. We slaan rangen op zodat we goed kunnen sorteren. We gebruiken namen voor weergave. De namen en rangen hebben een één-op-één relatie voor elk van de kaarten en kleuren.

Wat is het aantal kleuren voor elke hand? We geven alleen om handen die 3 of meer kaarten van dezelfde kleur hebben. Dat zal ons vertellen wie betere kansen heeft op een pokerflush. Merk op dat hoewel GROUP BY ORDER BY lijkt te impliceren, dit niet het geval is. ORDER BY moet expliciet zijn.

Dus wat als u uw zoekopdracht verkeerd hebt gegroepeerd? Als deze hand tafel is niet gegroepeerd op handid, dan krijg je 30 records van 6 handen van 5-kaarten. Als u aggregaten had, zouden deze per rij zijn gegroepeerd. Niet erg nuttig.

Als u de kaartnaam samenvoegt en
de kaartnaam niet alleen op de doellijst opneemt en probeert te bestellen op kaartnaam,
ontvangt u de foutmelding dat deze niet in
zou moeten staan de volgorde per clausule. De volgorde op clausule moet
elementen van de groep op clausule bevatten.
Als de kaartnaam echter expliciet in de doellijst staat,

dan moet de kaartnaam in de group by-clausule staan ​​en
daarom toegestaan ​​in de order by-clausule.

Als de vraag op kleur is, zijn er minimaal 1 of maximaal 4 records per kleur voor elk van de zes handen. Merk op dat we sorteren op rangorde die
ook in de group by-clausule moet staan. su_name en su_rank hebben een één-op-één relatie.

Om de verdeling van kaarten in handen te zien, moeten we groeperen op de kaartrangkolom. Natuurlijk zijn er 4 kleuren van elke kaart, dus je ziet geen kaart in meer dan vier handen.

Om een ​​kijkje te nemen en te zien wie azen heeft, kunnen we de volgende korte vraag gebruiken. Merk op dat er een WHERE-clausule is die wordt uitgevoerd tijdens het verzamelen van de rijen. HAVING wordt uitgevoerd nadat de rijen zijn verzameld.

Samenvatting

Deze voorbeelden zijn eenvoudige manieren om bekende entiteiten te evalueren. Experimenteer en gebruik deze eenvoudige regels.

  • Als een kolom op de doellijst staat en geen aggregaat, moet deze in een GROUP BY-clausule staan.
  • WHERE-clausules komen voor tijdens het selectieproces.
  • HAVING-clausules komen voor nadat de aggregaten zijn voltooid.
  • Alleen niet-aggregaten kunnen in de ORDER BY-clausule staan.
  • De volgorde van de GROUP BY-clausule is van belang.

  1. Opgeslagen procedures schrijven voor professionele SSRS-rapporten

  2. ProxySQL-native clustering met Kubernetes

  3. Fout 28000:Inloggen mislukt voor gebruiker DOMAIN\\gebruiker met pyodbc

  4. Oracle:Zoeken in volledige tekst met voorwaarde