V dotazech SQL používáme klauzuli Group by k použití agregačních funkcí.
- Ale jaký je účel použití číselné hodnoty namísto názvu sloupce s klauzulí Seskupit podle? Například: Seskupit do 1.
Komentáře
Odpověď
To je ve skutečnosti opravdu špatné dělat IMHO a ve většině ostatních databázových platforem to není podporováno.
Důvody, proč to lidé dělají:
- they „re lazy – Nevím, proč si lidé myslí, že jejich produktivita je zlepšena psaním stručného kódu místo psaní dalších 40 milisekund, aby se získal mnohem doslovnější kód.
Důvody, proč je to špatné:
-
není to samo dokumentující – někdo bude muset analyzovat seznam SELECT, aby zjistil seskupení. Ve skutečnosti by to bylo o něco jasnější na serveru SQL Server, který nepodporuje kovboje kdo – ví, co se stane seskupení jako MySQL.
-
je to křehké – někdo přijde a změní seznam SELECT, protože obchodní uživatelé chtěli jiný výstup zprávy a nyní je váš výstup nepořádek. Pokud jste použili názvy sloupců v GROUP BY, pořadí v seznamu SELECT by bylo irelevantní.
SQL Server podporuje ORDER BY [ordinal]; zde uvádíme několik paralelních argumentů proti jeho použití:
Odpověď
MySQL umožňuje provádět GROUP BY
s aliasy ( Problémy s aliasem sloupců ). Bylo by to mnohem lepší, než dělat GROUP BY
s čísly.
- Někteří to stále učí
- Některé mají
column number
v diagramech SQL . Jeden řádek říká: Seřadí výsledek podle daného čísla sloupce nebo podle výrazu. Pokud je výrazem jeden parametr, bude hodnota interpretována jako číslo sloupce. Záporná čísla sloupců mění pořadí řazení. - Apache již nepoužívá, protože SQL Server má
Google má mnoho příkladů jeho použití a proč ho mnoho přestalo používat.
Abych byl upřímný, nepoužil jsem čísla sloupců pro ORDER BY
a GROUP BY
od roku 1996 (v té době jsem dělal Oracle PL / SQL Development). Používání čísel sloupců je opravdu pro staré lidi a zpětná kompatibilita umožňuje těmto vývojářům používat MySQL a další RDBMS, které stále to povolte.
Odpověď
Zvažte následující případ:
+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Apps | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Apps | 1 | | 2016-05-31 | Videos | 1 | | 2016-05-31 | Videos | 1 | | 2016-06-01 | Apps | 3 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Videos | 2 | | 2016-06-01 | Apps | 2 | +------------+--------------+-----------+
Zjistíte počet stažení za službu za den, přičemž aplikace a aplikace považujete za stejnou službu. Seskupení podle date, services
by vedlo k tomu, že Apps
a Applications
budou považovány za samostatné služby.
V tom případě by byl dotaz:
select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services
A výstup:
+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Apps | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Apps | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+
Ale to není to, co chcete, protože aplikace a aplikace, které mají být seskupeny, jsou podmínkou. Co tedy můžeme dělat?
Jedním ze způsobů je nahradit Apps
Applications
pomocí CASE
výraz nebo funkce IF
a jejich seskupení do služeb jako:
select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services
Toto ale stále seskupuje služby s ohledem na Apps
a Applications
jako různé služby a poskytuje stejný výstup jako dříve:
+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Applications | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Applications | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+
Seskupení podle čísla sloupce umožňuje seskupit data na aliasovaný sloupec.
select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2;
A tak vám poskytneme požadovaný výstup, jak je uvedeno níže:
+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 4 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 9 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+
Jsem mnohokrát si přečtěte, že se jedná o líný způsob psaní dotazů nebo seskupování přes aliasovaný sloupec nefunguje v MySQL, ale toto je způsob seskupování přes aliasované sloupce.
Toto není upřednostňovaný způsob psaní dotazů, použijte jej pouze v případě opravdu musíte seskupit přes aliasovaný sloupec.
Komentáře
- " Ale toto stále seskupuje služby považující aplikace a aplikace za různé služby a poskytuje stejný výstup jako dříve ".Nebylo by to ' vyřešeno, pokud jste pro alias vybrali ' jiný (nekonfliktní) název?
- @ Daddy32 Přesně moje myšlenka. Nebo dokonce ještě jednou vnořit (seskupit po výběru)
Odpovědět
Neexistuje žádný oprávněný důvod jej použít. Je to prostě líná zkratka, která je speciálně navržena tak, aby některým vývojářům, kteří jsou pod velkým tlakem, zkomplikovali pozdější seskupení nebo řazení nebo aby umožnili bídnému selhání kódu při změně pořadí sloupců. Buďte ohleduplní ke svým kolegům vývojářům a nedělejte to.
Odpovědět
Toto funguje pro mě. Kód seskupuje řádky až do 5 skupin.
SELECT USR.UID, USR.PROFILENAME, ( CASE WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN @curRow := 0 ELSE @curRow := @curRow + 1 /*@curRow := 1*/ /*AND @curCode := USR.UID*/ END ) AS sort_by_total FROM SS_USR_USERS USR, ( SELECT @curRow := 0, @curCode := "" ) rt ORDER BY USR.PROFILENAME, USR.UID
Výsledek bude následující
odpověď
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2; SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3;
Zvažte výše uvedené dotazy: Seskupit podle 1 znamená seskupit podle prvního sloupce a seskupit podle 1,2 znamená seskupit podle prvního a druhého sloupce a seskupit podle 1,2,3 znamená seskupit podle prvního druhého a třetího sloupce. Například:
tento obrázek ukazuje první dva sloupce seskupené podle 1,2, tj. nezohledňuje různé hodnoty dep_date k nalezení počtu (pro výpočet počtu jsou brány v úvahu všechny odlišné kombinace prvních dvou sloupců) vzhledem k tomu, že druhý dotaz vede k tomuto
obrázku. Zde uvažujeme všechny první tři sloupce a tam různé hodnoty pro nalezení počtu, tj. Je seskupení podle všech prvních tří sloupců (pro výpočet počtu jsou brány v úvahu všechny odlišné kombinace prvních tří sloupců).
order by 1
pouze vsedě namysql>
řádku. V kódu použijteORDER BY id ASC
. Všimněte si případu, explicitního názvu pole a explicitního směru řazení.