2013-12-09 6 views
6

よく知られている質問ですが、Verticaがあります。各tag_idの合計(imps)に基づいて上位5つのgeo_country行を返したいとします。Return各グループ(Vertica/vsql)のN個の行

SELECT tag_id, 
     geo_country, 
     SUM(imps) AS imps, 
     RANK() OVER (PARTITION BY tag_id ORDER BY SUM(imps) DESC) AS rank 
FROM table1 
WHERE tag_id IN (2013150,1981153) 
AND ymd > CURRENT_DATE - 3 
GROUP BY 1, 
     2 LIMIT 10; 

これは、実際にはWHERE句(2013150)の最初のタグから行のみを返します。私は、他のタグは結果にそれを含めることが十分に高いサム(imps)値を持っていることを知っている。

また、Top Nの部分を実装するにはどうすればよいですか? OVER関数内にLIMIT節を追加しようとしましたが、受け入れられたパラメータのようには見えません。

答えて

9

解決済み。解決策は、サブクエリにクエリを変換し、節は、ランクによってフィルタリングするWHERE使用することです:

SELECT * 
FROM (SELECT tag_id, geo_country, sum(imps), 
    RANK() OVER (PARTITION BY tag_id ORDER BY SUM(imps) DESC) AS rank 
    FROM table1 
    WHERE tag_id IN (2013150,1981153) 
    AND ymd > CURRENT_DATE - 3 
    GROUP BY 1,2) as t2 
WHERE t2.rank <=5; 
+0

これは私が毎回使うパターンですが、何らかの理由でそれほど満足できません。私は分析的な質問のためにHAVINGに類似した何かがあったと思いますか? – kimbo305

+1

質問を完了するためにあなたの答えを受け入れることを検討してください。 – Kermit

+0

@ kimbo305これは、アナリティッククエリがどのように機能するのか、SQL標準に従うのかということではありません。 – Kermit

0

私はここで何が起こっているのかを考えることはTAG_ID、その後geo_country上の桁のグループがあなたのデータということです。制限を行うと、最初の10レコードが取得されます。 tag_id 1に少なくとも10個のgeo_countriesがある場合、結果にはtag_id 1しか表示されません。あなたの問題を解決するランクASCでソートしないだろう。

Verticaで並べ替えでランクを使用することが許可されているかどうかはわかりません。

SELECT tag_id, 
    geo_country, 
    SUM(imps) AS imps, 
    RANK() OVER (PARTITION BY tag_id ORDER BY SUM(imps) DESC) AS rank 
FROM table1 
WHERE tag_id IN (2013150,1981153) 
AND ymd > CURRENT_DATE - 3 
GROUP BY 1, 
     2 
ORDER BY 4 
LIMIT 10; 
関連する問題