2017-02-25 23 views
-1

私はSakila DBを使用してMySQLで自分のスキルを実践しています。集計後にグループの最初のn行を取得する

私はrentals_customer_store_film_categoryというビューを作成しましたが、顧客、支払い、レンタル、映画、カテゴリテーブルの組み合わせがあります。 私は今、収益によってトップ5の映画を手に入れたいと思います。私は、各映画のすべての収入を店舗で合計して、最初の5を返すことを意味しています。 私は以下のコードを試しましたが、うまくいきません。 何が間違っているのかわかりません 助けが必要ですか?

SELECT store_id, film_id, income 
FROM 
(SELECT film_id, store_id, sum(amount) as income, 
    @store_rank := IF(@current_store = store_id, @store_rank + 1, 1) AS store_rank, 
    @current_store := store_id 
FROM rentals_customer_store_film_category 
group by store_id, film_id 
ORDER BY store_id, income DESC, film_id 
) ranked 
WHERE store_rank <= 5 

結果以下のとおりです。ご覧のとおり、店舗ごとに5行目で停止するわけではありません。私は店のための唯一のトップ5を希望しつつ、店舗によって全ての膜を示す:店舗IDのID 1とトップ5 2.この場合

store_id film_id income 
1 971 134.82 
1 879 132.85 
1 938 127.82 
1 973 123.83 
1 865 119.84 
1 941 117.82 
1 267 116.83 
1 327 110.85 
1 580 106.86 
1 715 105.85 
1 897 104.85 
... 
... 
... 
... 
2 878 127.83 
2 791 127.82 
2 854 123.83 
2 946 117.86 
2 396 113.81 
2 369 111.84 
2 764 110.85 
2 260 110.84 
2 838 110.82 
2 527 109.83 
2 893 106.84 
2 71 102.87 
2 8 102.82 
... 
... 
... 
... 
+0

私たちはあなたに役立つようにいくつかのサンプルデータとあなたが得ようとしている結果を共有してください。 – Mureinik

+0

が完了しました。前にそれをやっていないため申し訳ありません。 – user3623123

答えて

1

順序は、現在と以前STORE_IDを比較することが重要です。これを試してみてください:

SELECT store_id, film_id, income 
FROM 
(SELECT film_id, store_id, sum(amount) as income, 
     #First compare previus with current 
    @store_rank := IF(@prev_store = store_id, @store_rank + 1, 1) AS store_rank, 
    #asign previus store 
    @prev_store := store_id 
FROM films 
group by store_id, film_id 
ORDER BY store_id, income DESC, film_id 
) ranked 
WHERE store_rank <= 5 
関連する問題