Co oznacza klauzula SQL „GROUP BY 1”?

201

Ktoś wysłał mi kwerendy SQL, gdzie GROUP BYklauzula składał oświadczenia: GROUP BY 1.

To musi być literówka, prawda? Alias ​​nie zawiera żadnej kolumny. Co to może znaczyć? Czy mam prawo założyć, że to musi być literówka?

Spencer
źródło
6
To nie literówka, to pierwsza kolumna zestawu wyników
Lamak
9
Pamiętaj, że ta składnia jest nieprzenośna. Będzie zachowywać się inaczej w bazach danych innych niż mysql. Na przykład w Oracle jest traktowane jako stała.
Russell Reed,
2
@RussellReed Tak. niestety (ponieważ użycie aliasu jest czasami bardzo pomocne) ansi sql nie pozwala na grupowanie według porządków kolumnowych. Powodem jest to, że grupa przez dzieje przed projekcją. Ale potem… co, kiedy mamy grupowanie wyrażeń z dziesiątkami linii… w końcu otrzymujemy… wiele dziesiątek linii w końcowej instrukcji sql.
javadba

Odpowiedzi:

230

Oznacza to grupowanie według pierwszej kolumny, niezależnie od tego, jak się nazywa. Możesz zrobić to samo z ORDER BY.

Fuj
źródło
74
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

W powyższym zapytaniu GROUP BY 1odnosi się do tego, first column in select statementco jest account_id.

Możesz także podać w ORDER BY.

Uwaga: Liczba w ORDER BY i GROUP BY zawsze zaczyna się od 1, a nie od 0.

Vishwanath Dalvi
źródło
25

Oprócz grupowania według nazwy pola można również grupować według porządkowej lub pozycji pola w tabeli. 1 odpowiada pierwszemu polu (niezależnie od nazwy), 2 oznacza drugie i tak dalej.

Jest to generalnie odradzane, jeśli grupujesz coś konkretnego, ponieważ struktura tabeli / widoku może ulec zmianie. Dodatkowo może być trudno szybko zrozumieć, co robi zapytanie SQL, jeśli nie zapamiętałeś pól tabeli.

Jeśli zwracasz unikalny zestaw lub szybko przeprowadzasz tymczasowe wyszukiwanie, jest to miła skrócona składnia, aby ograniczyć pisanie. Jeśli planujesz ponownie uruchomić zapytanie w pewnym momencie, zalecam ich zastąpienie, aby uniknąć przyszłych nieporozumień i nieoczekiwanych komplikacji (z powodu zmian w schemacie).

vol7ron
źródło
10
+1 za „nie rób tego” i dodam, że najlepszym powodem, aby tego uniknąć, jest to, że nie można go odczytać.
Fuj
11

Pogrupuje według pierwszego pola w klauzuli select

Daan Geurts
źródło
5

Oznacza to, że grupa sql według 1. kolumny w Twojej klauzuli select, zawsze używamy tego GROUP BY 1razem ORDER BY 1, poza tym możesz również używać w ten sposób GROUP BY 1,2,3.., oczywiście jest to dla nas wygodne, ale musisz zwrócić uwagę na ten warunek, wynik może nie być tym, co ty chcesz, jeśli ktoś zmodyfikował wybrane kolumny i nie jest to wizualizowane

张艳军
źródło
4

Będzie grupować według pozycji kolumny, którą umieściłeś po grupie według klauzuli.

Na przykład, jeśli uruchomić „ SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1” to będzie przez grupę SALESMAN_NAME.

Jednym z ryzyk jest to, że jeśli uruchomisz ' Select *' iz jakiegoś powodu odtworzysz tabelę z kolumnami w innej kolejności, da ci to inny wynik, niż byś się spodziewał.

wdoering
źródło