2016-05-26 5 views
0

次の表のSQLテーブル(SparkSQL)があります。SparkSQLで都市ごとに上位10項目を選択

user_id, city, timestamp, item_id 

私は与えられたそれぞれの日付に(時間数の面でのitem_idは、その都市に登場)指定された都市の上位10項目を見つける必要があります。

私はその後、次のでした:それはRNで並べ替えるのに

SELECT * 
FROM  ( 
       SELECT *, 
         row_number() OVER partition BY city AS rn 
       FROM mytable) AS foo 
ORDER BY rn DESC 

しかし、それはちょうど私に与えられた日付のトップ10の要素を与えませんでした。これを修正する適切な方法は何でしょうか?ありがとう!

+1

'を計算'と 'それぞれの与えられたdate'にあなたが街でパーティションなければならないことを意味し、日付(1日はより多くを持っている可能性が必要です1タイムスタンプ?)。 「トップ10」とは、トップオーダー10点を得るために何か**を注文する必要があることを意味します。 **何か**あなたが注文したいものは何ですか? –

+0

トランザクションレコードであると仮定すると、item_1は1000回出現し、item_2は950回出現する可能性があります。私はそれがその都市のために各項目が現れる回数によって順序付けされてほしいです。私。それぞれの都市について、ベスト10のベストセラー商品を表示したいと思います。 – Edamame

答えて

2

sparkのtimestampからTRUNC時間までの関数は何か分かりません。

しかし、最初に、あなたは、カウントして、ROW_NUMBER与えられた都市の

SELECT * 
FROM (
     SELECT city, item_id, theDATE, cnt, 
       ROW_NUMBER() OVER (PARTITION BY city, theDATE 
            ORDER BY cnt) rn    
     FROM  (SELECT city, 
         timestamp, 
         item_id, 
         to_date(timestamp) as theDATE, -- remove time and leave just date. 
         COUNT(item_id) OVER (PARTITION BY city, to_date(timestamp)) cnt 
        FROM mytable 
       ) AS foo 
    ) AS boo 
WHERE rn <= 10 
ORDER BY city, theDATE, rn 
+1

時間を切り捨てる機能はto_date(...) – eliasah

+0

あなたの問題を解決しましたか? –

関連する問題