PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dlaczego nie mogę wykluczyć kolumn zależnych z `GROUP BY` podczas agregacji według klucza?

Ponieważ tylko PK obejmuje wszystkie kolumny tabeli bazowej w GROUP BY klauzula. Dlatego twoje pierwsze zapytanie działa. UNIQUE ograniczenie nie.

Kombinacja nieodroczonego UNIQUE i NOT NULL Ograniczenie również by się kwalifikowało. Ale to nie jest zaimplementowane — podobnie jak kilka innych zależności funkcjonalnych znanych ze standardu SQL. Peter Eisentraut, główny autor artykułu, miał więcej na myśli, ale w tamtym czasie ustalono, że popyt jest niski, a związane z nim koszty mogą być wysokie. Zobacz dyskusję na temat tej funkcji na pgsql-hackers.

Instrukcja:

Gdy GROUP BY jest obecny lub istnieją jakiekolwiek funkcje agregujące, nie jest prawidłowy dla SELECT listy wyrażeń odwołujących się do niezgrupowanych kolumn, z wyjątkiem funkcji agregujących lub sytuacji, gdy niezgrupowana kolumna jest funkcjonalnie zależna od zgrupowanych kolumn, ponieważ w przeciwnym razie dla niezgrupowanej kolumny mogłaby zostać zwrócona więcej niż jedna wartość. Zależność funkcjonalna istnieje, jeśli zgrupowane kolumny (lub ich podzbiór) są kluczem podstawowym tabeli zawierającej niezgrupowaną kolumnę.

I bardziej wyraźnie:

PostgreSQL rozpoznaje zależności funkcjonalne (pozwalając na pomijanie kolumn z GROUP BY ) tylko wtedy, gdy klucz podstawowy tabeli jest zawarty w GROUP BY lista. Standard SQL określa dodatkowe warunki, które należy rozpoznać.

Od c.vin jest UNIQUE NOT NULL , możesz poprawić drugie zapytanie, używając zamiast tego kolumny PK:

...
group by c.id;

Poza tym, podczas gdy integralność referencyjna jest wymuszana, a cała tabela jest odpytywana, oba podane zapytania mogą być znacznie tańsze:agregowanie wierszy w appraisal przed sprzężenie. Eliminuje to potrzebę GROUP BY w zewnętrznym SELECT apriorycznie. Na przykład:

SELECT c.vin, c.color, c.brand
     , a.min_appraisal
     , a.max_appraisal
FROM   car c
LEFT   JOIN (
   SELECT car_vin
        , min(price) AS min_appraisal
        , max(price) AS max_appraisal
   FROM   appraisal
   GROUP  BY car_vin
   ) a ON a.car_vin = c.vin;

Zobacz:

  • Wiele wywołań array_agg() w jednym zapytaniu

Powiązane:

  • Oświadczenie SQL działające w MySQL nie działa w Postgresql - Sum i group_by rails 3
  • PostgreSQL - klauzula GROUP BY



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Szybkość SQL SELECT int vs varchar

  2. PostgreSQL wybiera najnowszy wpis dla danego identyfikatora

  3. Rails 3.1 - Pushing to Heroku - Błędy podczas instalacji adaptera postgres?

  4. Czas Postgresa z równością stref czasowych

  5. Połącz się z bazą danych PostgreSQL w kontenerze Docker