Skip to content

Instantly share code, notes, and snippets.

@bz0
Created January 4, 2020 02:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bz0/410685383358131ac44218b70a1aa334 to your computer and use it in GitHub Desktop.
Save bz0/410685383358131ac44218b70a1aa334 to your computer and use it in GitHub Desktop.

連番を振る

https://ja.stackoverflow.com/questions/11654/mysql%E3%81%AEsql%E3%81%AB%E3%81%A6%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%86%85%E3%81%A7%E9%80%A3%E7%95%AA%E3%82%92%E4%BB%98%E3%81%91%E3%81%9F%E3%81%84

集計なしver

集計なしの為、相関サブクエリで連番を取得できます。

SELECT
    t1.shopname,
    (
        SELECT
            count(*) + 1
        FROM
            sales2 t2
        WHERE
            t1.sales < t2.sales
    ) AS no
FROM
    sales2 t1
ORDER BY
    sales DESC

集計ありver

質問したときは、店舗・年月・デバイス単位にしてましたが、分かりづらいので もっと単純な形式にします。(今回デバイスを削りました)

店舗単位に売上を集計し、売上の降順に連番を振ります。

ダメなSQL その1

相関サブクエリでテーブル(t1)の売上集計とテーブル(t2)の売上集計を比較して テーブル(t1)の売上集計より大きい店舗が何店舗あるかで順位を出そうとしています。

SELECT
    t1.shopname,
    SUM(t1.sales) AS sales,
    (
        SELECT @sales:=t1.sales
        FROM (
            SELECT
                shopname,
                SUM(sales) as sales
            FROM
                sales tmp
            GROUP BY shopname
        ) AS t2
        WHERE
            t1.sales < t2.sales
    ) AS no
FROM sales t1
GROUP BY shopname
ORDER BY sales DESC

が、下記のような結果になってしまいます。

相関サブクエリでの売上の集計結果の比較が、t1が集計前のものが 利用されているためと思われます。

OK(ユーザ変数利用)

店舗単位で連番を振りなおすといったことをしないので

SET @no:=0;
SELECT shopname,
       @no:=@no+1,
       sales
FROM (
    SELECT
        t1.shopname,
        SUM(t1.sales) AS sales
    FROM sales t1
    GROUP BY shopname
    ORDER BY sales DESC
) AS t1

OK(ユーザ変数利用)

FROMで初期化する形であれば、

SELECT @n:=@n+1 AS rank,
       shopname,
       sales
FROM (
    SELECT
        t1.shopname,
        SUM(t1.sales) AS sales
    FROM sales t1
    GROUP BY shopname
    ORDER BY sales DESC
) AS t1, (SELECT @n:=0) t2

my.cnf

my.cnfにローカルファイルを使う場合、パーミッションが777になってしまいエラーになるので Dockerfileで、chmodでパーミッション変更を行う

FROM mysql:5.7
COPY my.cnf /etc/mysql/conf.d/
RUN chmod 664 /etc/mysql/conf.d/my.cnf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment