2016-12-08 15 views
0

おかしなタイトルの謝罪 - 何か良いものを考え出すことができませんでした。SQLの注文 - 一番上の行の中の一番上の行を選択してください

私は以下の表を持っている:

Customer_ID Item_ID  sale_ID sale_TS 
103293   I-0394039 S-430943 20161101 

私が最も売上高及びそれらのそれぞれのトップ100の顧客、彼らは与えられた時間枠内で購入した上位100アイテムを見つける必要があります。これは私がこれまで持っているものです。

select vs.Customer_ID, vs.Item_ID, count(*) count2 
from sales.sales_import si1 
join 
(
    select Customer_ID, count(*) s_count2 from sales.sales_import where 
    sale_TS between '2016-01-01' and '2016-01-31' group by Customer_ID order by sale_TS desc limit 100 
) 
si2 
on si1.Customer_ID = si2.Customer_ID 
where 
si1.sale_TS between '2016-01-01' and '2016-01-31' 
group by vs.Customer_ID, vs.Item_ID 
order by vs.Customer_ID, count2 desc limit 100 

質問:

  • 私は基本的にここにテーブルをそれ自体に参加しています、より良い方法はありますか?
  • Customer_IDごとに上位100項目のみを返すようにクエリを制限するにはどうすればよいですか?ここの外側の制限はすべての行を制限し、customerIDあたりの最初のXを制限しません。

答えて

0

row_number関数を試してください。 2つの派生テーブル(FROM句で使用されるサブクエリ)を構築する必要があります。 1つは顧客用、もう1つは商品用です。内部はサブクエリを結合するので、最初の派生テーブルで返された顧客からのアイテムのみを取得します。

select * from 
--get your top 100 customers 
    (select * from 
    (select Customer_ID, row_number() OVER (order by sale_TS) as rank 
    from sales_import 
    where sale_TS between '2016-01-01' and '2016-01-31' 
    group by Customer_ID) 
    where rank <= 100) custs 
--now build out a derived table that picks out the top 100 items they purchased using the same method 

項目

--now inner join your 2 derived tables 
where custs.Customer_ID, = items.Customer_ID 
+0

ここランクは単にあなたの販売数をどうするSale_TScolumnの何に基づいて行数になるだろう(から何とか何とか何とかを(何とか何とか何とかを選択))。 – Matt

関連する問題