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

  • Používejte order by 1 pouze vsedě na mysql> řádku. V kódu použijte ORDER BY id ASC. Všimněte si případu, explicitního názvu pole a explicitního směru řazení.

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.

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í

sem zadejte popis obrázku

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:

seskupit podle 1,2

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 seskupit podle 1,2,3

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ů).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *