Dela via


MISSING_AGGREGATION-felklass

SQLSTATE: 42803

Det icke-aggregerande uttrycket <expression> baseras på kolumner som inte deltar i GROUP BY-satsen.

Lägg till kolumnerna eller uttrycket i GROUP BY, aggregera uttrycket eller använd <expressionAnyValue> om du inte bryr dig om vilka av värdena i en grupp som returneras.

Parametrar

  • uttryck: Icke-aggregering, icke-grupperingsuttryck i listan SELECT.
  • expressionAnyValue: expression omsluten av en any_value() aggregatfunktion.

Förklaring

I kontexten för en fråga med en GROUP BY-sats måste de lokala kolumnreferenserna i listan SELECT vara:

  • Används som argument för en mängdfunktion, eller
  • En del av ett uttryck som matchar ett uttryck i GROUP BY-satsen.

En lokal kolumnreferens är en kolumn som har lösts till en tabellreferens i frågans FROM-sats.

Med andra ord: Kolumnreferenser måste antingen ingå i grupperingsnycklarna eller vara en del av aggregeringen.

Azure Databricks matchar uttryck på bästa: Till exempel identifieras: SELECT c1 + 5 FROM T GROUP BY 5 + c1 som matematiska uttryck. Men SELECT c1 FROM T GROUP BY c1 + 5 är inte någon match.

Förmildrande omständighet

Avhjälpandet av felet beror på orsaken:

  • Missade du en grupperingskolumn?

    Lägg till expression, eller relevant underuttryck av expression i GROUP BY-satsen.

  • Är kolumnreferensen en del av ett GROUP BY-uttryck som skiljer sig från epression?

    Matcha uttrycket i SELECT-listan eller förenkla GROUP BY-uttrycket.

  • Saknar du aggregeringen?

    Omslut kolumnreferensen med en mängdfunktion. Om du bara vill ha ett representativt värde från gruppen kan du använda any_value(epression).

Exempel

-- 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