SQLクエリでGroup by 1とGroup by 1,2,3を使用するのはなぜですか?


26

SQLクエリでは、Group by句を使用して集計関数を適用します。

  • しかし、Group by句で列名の代わりに数値を使用する背後にある目的は何ですか?例:1でグループ化します。

3
プロンプトorder by 1に座っている場合にのみ使用してmysql> ください。コードでは、を使用しますORDER BY id ASC。ケース、明示的なフィールド名、および明示的な順序の方向に注意してください。
dotancohen

回答:


28

これは実際に私見を行うには本当に悪いことであり、他のほとんどのデータベースプラットフォームではサポートされていません。

人々がそれをする理由:

  • 彼らは怠け者です -もっと多くのリテラルコードを取得するために40ミリ秒余分に入力するのではなく、簡潔なコードを書くことで生産性が向上すると人々が考える理由はわかりません。

悪い理由:

  • それは自己文書化ではありません -誰かがグループ化を理解するためにSELECTリストを解析する必要があります。実際には、SQL Serverではもう少し明確になります。SQLServerは、MySQLのように何が起こるかを知っているカウボーイグループ化をサポートしていません。

  • それは脆性だ -誰かが入って来やビジネスユーザーが別のレポート出力を望んでいた、そして今、あなたの出力が混乱であるため、SELECTリストを変更します。GROUP BYで列名を使用していた場合、SELECTリストの順序は関係ありません。

SQL ServerはORDER BY [ordinal]をサポートしています。以下は、その使用に対するいくつかの並行する引数です。


9

MySQLではGROUP BY、エイリアスを使用できます(列エイリアスの問題)。これはGROUP BY、数値を使用するよりもはるかに優れています。

Googleには多くの使用例と、多くの人が使用をやめた理由があります。

正直に言うORDER BYGROUP BY、1996年以降は列番号を使用していません(当時はOracle PL / SQL開発を行っていました)。列番号を使用することは、実際には旧型のユーザー向けであり、下位互換性により、そのような開発者は、MySQLおよびそれを許可する他のRDBMSを使用できます。


8

以下の場合を考慮してください:

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

アプリとアプリケーションを同じサービスと見なして、サービスごとの1日あたりのダウンロード数を調べる必要があります。グループ化するdate, servicesことになるAppsApplications、別のサービスを検討されています。

その場合、クエリは次のようになります。

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

そして出力:

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

ただし、アプリケーションとアプリをグループ化することが要件であるため、これは必要なものではありません。それで、私たちは何ができますか?

1つの方法は、式または関数AppsApplications使用して置き換えることで、それらをサービス上で次のようにグループ化することです。CASEIF

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

しかし、これはまだグループのサービスは、考慮Appsし、Applicationsさまざまなサービスなど、以前と同じ出力が得られます。

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

列番号でグループ化すると、エイリアス列のデータをグループ化できます。

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

したがって、次のように目的の出力が得られます。

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

私はこれがクエリを記述する怠zyな方法であるか、エイリアス列をグループ化することはMySQLでは機能しないことを何度も読みましたが、これはエイリアス列をグループ化する方法です。

これはクエリを記述するための好ましい方法ではありません。エイリアス列でグループ化する必要がある場合にのみ使用してください。


しかし、これはアプリとアプリケーションを異なるサービスとみなすサービスをグループ化し、以前と同じ出力を提供します」エイリアスに別の(競合しない)名前を選択した場合、これは解決しませんか?
パパ32

3

それを使用する正当な理由はありません。これは、一部のハードプレス開発者が後でグループ化や並べ替えを理解するのを困難にしたり、誰かが列の順序を変更したときにコードが悲惨に失敗したりするのを困難にするために特別に設計された怠shortcutなショートカットです。仲間の開発者に配慮し、それをしないでください。


0

これは私のために働いています。このコードは、最大5グループまで行をグループ化します。

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

結果は次のようになります

ここに画像の説明を入力してください


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;

上記のクエリを検討してください。1でグループ化は最初の列でグループ化することを意味し、1,2でグループ化することは最初と2番目の列でグループ化することを意味します。例えば:

1,2でグループ化

この画像は、1,2でグループ化された最初の2列を示しています。つまり、カウントを見つけるためにdep_dateの異なる値を考慮していません(最初の2列のすべての異なる組み合わせを考慮してカウントを計算します)。 1,2,3でグループ化

画像。ここでは、最初の3列すべてを考慮し、カウントを見つけるために異なる値があります。つまり、最初の3列すべてでグループ化されます(カウントを計算するには、最初の3列のすべての異なる組み合わせが考慮されます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.