SQL sorgusunda neden Grup 1'i ve Grup 1,2,3'ü kullanıyoruz?


26

SQL sorgularında toplama işlevlerini uygulamak için Group by cümlesi kullanıyoruz.

  • Ancak, Grup cümlecikli sütun adı yerine sayısal değer kullanmanın ardındaki amaç nedir? Örneğin: 1'e göre gruplandırın.

3
order by 1Sadece mysql> komut isteminde otururken kullanın . Kodda kullanın ORDER BY id ASC. Durum, açık alan adı ve açık sipariş yönüne dikkat edin.
dotancohen

Yanıtlar:


28

Bu aslında IMHO'yu yapmak için gerçekten kötü bir şey ve çoğu diğer veritabanı platformlarında desteklenmiyor.

İnsanların bunu yapmasının sebepleri:

  • onlar tembeldir - İnsanların neden üretkenliklerini arttırdıklarını bilmiyorum, 40 milisaniye daha yazmak için daha fazla kod yazarak yerine kısa kod yazarak.

Kötü nedenleri:

  • bu kendi kendini belgeleme değil - birisinin gruplandırmayı anlamak için SELECT listesini ayrıştırması gerekecek. Aslında, SQL Server'da, MySQL'in yaptığı gibi ne olacağını bilen kovboyları desteklemeyen biraz daha net olurdu.

  • kırılgandır - birisi gelir ve SELECT listesini değiştirir, çünkü iş kullanıcıları farklı bir rapor çıktısı istediler ve şimdi çıktınız bir karmaşa. GROUP BY içinde sütun isimleri kullanmış olsaydınız, SELECT listesindeki sıralamanın önemi olmazdı.

SQL Server SİPARİŞ BY [sıralı] destekler; İşte kullanımına karşı bazı paralel argümanlar:


9

MySQL, GROUP BYtakma adlarla ( Sütun Takma Adlarıyla İlgili Sorunlar) yapmanızı sağlar . Bu GROUP BYrakamlarla yapmaktan çok daha iyi olurdu .

Google’ın bunu kullanmanın birçok örneği ve neden pek çoğunun kullanmayı bıraktığı var.

Size karşı dürüst olmak gerekirse, 1996'dan beri ORDER BYve GROUP BYo zamandan beri sütun numaralarını kullanmadım (O zamanlar Oracle PL / SQL Development yapıyordum). Sütun numaralarını kullanmak gerçekten eski zamanlayıcılar içindir ve geriye dönük uyumluluk, bu tür geliştiricilerin MySQL ve hala buna izin veren diğer RDBMS'leri kullanmasını sağlar.


8

Aşağıdaki durumu göz önünde bulundurun:

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

Uygulamalar ve Uygulamalar aynı hizmet olarak kabul edilirse, günde servis başına indirme sayısını bulmanız gerekir. Göre gruplandırma date, servicesneden olur Appsve Applicationsayrı hizmet kabul ediliyor.

Bu durumda, sorgu şöyle olacaktır:

 select date, services, sum(downloads) as downloads
 from test.zvijay_test
 group by date,services

Ve Çıktı:

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

Ancak istediğiniz şey bu değil çünkü Uygulamalar ve Uygulamalar gruplanacak. Öyleyse ne yapabiliriz?

Tek yönlü değiştirmektir Appsile Applicationsbir kullanarak CASEifade ya da IFgibi hizmetlerin boyunca onları gruplama sonra fonksiyon ve:

select 
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test 
group by date,services

Ancak bu , farklı hizmetleri göz önünde bulundurarak Appsve Applicationsfarklı hizmetler olarak gruplandırmakta ve öncekiyle aynı çıktıyı vermektedir:

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

Sütun numarası üzerinden gruplamak, diğer ad sütununda verileri gruplandırmanıza izin verir.

select
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test
group by date,2;

Ve böylece size istenen çıktıyı aşağıdaki gibi vererek:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         4 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         9 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+

Sorgu yazma veya takma bir sütun üzerinde gruplama işleminin tembel bir yöntem olduğunu birçok kez okudum, ancak MySQL'de çalışmaz, ancak takma ad sütunlar üzerinde gruplama yöntemidir.

Sorgu yazmak için tercih edilen yöntem bu değildir, yalnızca gerçekten bir diğer ad sütununda gruplandırmanız gerektiğinde kullanın.


" Ancak bu, Uygulamaları ve Uygulamaları farklı hizmetler olarak değerlendiren hizmetleri gruplandırıyor ve daha önce olduğu gibi aynı çıktıyı veriyor ". Diğer ad için farklı (çelişkili olmayan) bir isim seçtiyseniz, bu çözülmez mi?
Daddy32,

3

Kullanmak için geçerli bir sebep yok. Bazıları zorla basılmış bir geliştiricinin gruplandırmanızı veya sıralamanızı daha sonra çözmesini veya birileri sütun sırasını değiştirdiğinde kodun perişan bir şekilde başarısız olmasına izin vermesini zorlaştırmak için özel olarak tasarlanmış tembel bir kısayoldur. Diğer geliştiricilerinize karşı saygılı olun ve bunu yapmayın.


0

Bu benim için çalıştı. Kod satırları 5 gruba kadar gruplandırır.

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

Sonuç aşağıdaki gibi olacak

görüntü tanımını buraya girin


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

Yukarıdaki sorguları göz önünde bulundurun: 1'e göre gruplama, birinci sütuna göre gruplama ve 1,2'ye göre gruplama, birinci ve ikinci sütuna göre gruplama ve 1,2,3'e kadar gruplama, ikinci ve üçüncü sütuna göre gruplama anlamına gelir. Örneğin:

1,2 ile gruplandır

bu resim 1,2 ile gruplanan ilk iki sütunu gösterir, yani sayımı bulmak için dep_date'in farklı değerlerini dikkate almaz (ilk iki sütunun tüm farklı kombinasyonlarının sayısını hesaplamak için hesaba katılır) 1,2,3 ile gruplandır

görüntüsü. Burada ilk üç sütunun tümü göz önünde bulundurulur ve sayımı bulmak için farklı değerler vardır, yani, ilk üç sütunun tümüne göre gruplanır (sayımı hesaplamak için ilk üç sütunun tüm ayrı kombinasyonlarını dikkate alır).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.