2013-12-09 27 views
6

Tanıdık soru, ancak Vertica ile. Her bir tag_id için toplam 5 geo_country satırını toplama (imps) göre döndürmek istiyorum. Bu aslında NEREDE maddesinin (2013150) ilk etiketinden satırları döndürenHer grup için en üst N satırı (Vertica/vsql)

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; 

: Bu başladığım sorgusu olur. Diğer etiketin sonuçlara içermesi gereken toplamı (imps) yeterince yüksek olduğunu biliyorum.

Ayrıca, En Çok N bölümünü nasıl uygularım? OVER fonksiyonu içinde bir LIMIT cümlesi eklemeyi denedim, ancak kabul edilen bir parametre gibi görünmüyor.

cevap

9

Çözüldü. Çözelti rütbesine göre filtrelemek için WHERE yan tümcesini kullanın sonra alt sorgu için sorgu dönüştürmek ve şudur:

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

Bu, her seferinde kullandığım kalıptır, ancak bazı nedenlerden dolayı tatminsizdir. Sanırım analitik sorgulamalar için HAVING'e benzeyen bir şey olmasını isterdim? – kimbo305

+1

Soruyu tamamlamak için cevabınızı kabul etmeyi düşünün. – Kermit

+0

@ kimbo305, analitik sorguların işleyiş şekli değil, SQL standartlarını da takip etmez. – Kermit

0

ne oluyor burada olduğunu düşünüyorum TAG_ID ve sonra geo_country üzerinde siparişler grup veri söyledi. Bir limit yapmak ilk 10 kaydı alır. Tag_id 1 için en az 10 tane geo_countries varsa, sonuçta yalnızca tag_id 1'i görürsünüz. ASC sıralamasında sıralamak sorununuzu çözmez.

Vertica'da bir sıralamaya izin verilmesine rağmen emin değilim.

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; 
İlgili konular