Delen via


MISSING_AGGREGATION foutklasse

SQLSTATE: 42803

De niet-aggregerende expressie <expression> is gebaseerd op kolommen die niet deelnemen aan de GROUP BY-clausule.

Voeg de kolommen of de expressie toe aan het GROUP BY, voeg de expressie samen of gebruik <expressionAnyValue> als u niet wilt bepalen welke waarden in een groep worden geretourneerd.

Parameters

  • -expressie: niet-samengevoegde, niet-groeperingsuitdrukking in de SELECT-lijst.
  • expressionAnyValue: expression verpakt in een statistische functie van any_value().

Uitleg

Binnen de context van een query met een GROUP BY-component moeten de lokale kolomverwijzingen in de SELECT lijst zijn:

  • Wordt gebruikt als argument voor een statistische functieof
  • Een deel van een expressie die overeenkomt met een expressie in de GROUP BY-component.

Een lokale kolomverwijzing is een kolom die is omgezet in een tabelverwijzing in de FROM--component van de query.

Met andere woorden: Kolomverwijzingen moeten deel uitmaken van de groeperingssleutels, of ze moeten deel uitmaken van de aggregatie.

Azure Databricks matcht expressies op best effort: bijvoorbeeld herkent het: SELECT c1 + 5 FROM T GROUP BY 5 + c1 als overeenkomende expressies. Maar SELECT c1 FROM T GROUP BY c1 + 5 komt niet overeen.

Verzachting

De beperking van de fout is afhankelijk van de oorzaak:

  • Hebt u een groeperingskolom gemist?

    Voeg expressionof de relevante subexpressie van expression toe aan de GROUP BY component.

  • Is het kolomreferentiegedeelte van een GROUP BY-expressie die verschilt van epression?

    De expressie in de SELECT lijst vergelijken of de GROUP BY-expressie vereenvoudigen.

  • Ontbreekt de aggregatie?

    Omhul de kolomreferentie met een aggregatiefunctie. Als u alleen een representatieve waarde van de groep wilt, kunt u any_value(epressie)gebruiken.

Voorbeelden

-- Sample data
> CREATE OR REPLACE TEMPORARY VIEW tasks(name, firstname, task, cost) AS
   VALUES ('Smith'  , 'Sam'   , 'UNPIVOT', 10),
          ('Smith'  , 'Sam'   , 'LATERAL',  5),
          ('Shuster', 'Sally' , 'DELETE' ,  7),
          ('Shuster', 'Sally' , 'GRANT'  ,  8);

-- `name` and `firstname` are part of the group by coumns, but incomplete
> SELECT name, firstname, sum(cost) FROM tasks GROUP BY firstname || ' ' || name;
 [MISSING_AGGREGATION] The expression "name" is neither present in the group by, nor is it an aggregate function.

-- Match the GROUP BY expression
> SELECT firstname || ' ' || name, sum(cost) FROM tasks GROUP BY firstname || ' ' || name;
 Sam Smith      15
 Sally Shuster  15

-- Break up the GROUP BY expression
> SELECT firstname, name, sum(cost) FROM tasks GROUP BY firstname, name;
 Sam    Smith   15
 Sally  Shuster 15

-- Missing grouping column
> SELECT name, firstname, sum(cost) FROM tasks GROUP BY name;
 [MISSING_AGGREGATION] The expression "firstname" is neither present in the group by, nor is it an aggregate function.

-- Add the grouping column
> SELECT firstname, name, sum(cost) FROM tasks GROUP BY firstname, name;
 Sam    Smith   15
 Sally  Shuster 15

-- Missing aggregate
> SELECT firstname, name, sum(cost), task FROM tasks GROUP BY firstname, name;
 [MISSING_AGGREGATION] The expression "task" is neither present in the group by, nor is it an aggregate function.

-- Add an aggregate
> SELECT firstname, name, sum(cost), array_agg(task) FROM tasks GROUP BY firstname, name;
 Sam    Smith   15  ["UNPIVOT","LATERAL"]
 Sally  Shuster 15  ["DELETE","GRANT"]

-- Return any task
> SELECT firstname, name, sum(cost), any_value(task) FROM tasks GROUP BY firstname, name;
 Sam    Smith   15  LATERAL
 Sally  Shuster 15  DELETE