2014-08-29 79 views
6

Sonuç kümesi, birkaç ekleme ve birleşim ile bir sql sorgusundan türetilir. Sql sorgusu zaten Tarih ve oyundaki satırları gruplandırır. Tarihe göre bölümlere ayrılmış bir oyundaki deneme sayısını tanımlamak için bir sütuna ihtiyacım var.PostgreSQL pencere işlevi: row_number() over (col2 tarafından bölüm col siparişi)

Username Game  ID Date 

johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 

Ben tarih ve oyun anlayışıyla bu oyunun örneklerinin sayısını istedikleri için bölüm içinde satırları ama tamamen doğru değil sıralar aşağıdaki sql sorgu ettik. Bu durumda johndoe1, zaman damgaları tarafından beş kez bölüştürülmüş Game_1'de teşebbüs etmiştir.

Bu sorgu döndürür bir işaretçiler büyük yardımı olacağını

select * 
, row_number() over (partition by ct."date" order by ct."date") as "Attempts" 
from csv_temp as ct 

Username Game  ID Date    Attempts (Desired Attempts col.) 

johndoe1 Game_1 100 7/22/14 1:52 AM 1   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 2   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 3   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 4   1 
johndoe1 Game_1 121 7/22/14 1:56 AM 1   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 2   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 3   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 4   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 5   2 
johndoe1 Game_1 130 7/22/14 1:59 AM 1   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 2   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 3   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 4   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 5   3 
johndoe1 Game_1 200 7/22/14 2:54 AM 1   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 2   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 3   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 4   4 
johndoe1 Game_1 210 7/22/14 3:54 AM 1   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 2   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 3   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 4   5 

aşağıda sonuç kümesi. a_horse_with_no_name belirtildiği gibi

+3

Belki bu yardımcı olacaktır http://java.dzone.com/articles/difference-between-rownumber –

+0

İstenilen sonuçlara bakıldığında, bir (İstenen Girişler col.) Grubundaki satırlar arasındaki tek fark, "Denemeler" sütunu. Belki sadece 'Kullanıcı Adı, Oyun, Kimlik' ile gruplandırabilir, denemelerin sayısını elde etmek için 'count (1) 'i ekleyebilir ve' (İstenen Girişler Col.) 'Yi almak için' row_number() 'yi ekleyebilirsiniz. – Jakub

cevap

16

bu ihtiyacı için biz dense_rank() aksine ihtiyaç bölüm değerleri değiştirdiğinizde, daha sonra, pencere açma fonksiyonu 1

DÜZENLEME de group by yeniden ediyorum alanlara benzer olması partition by düşünün row_number()rank() veya dense_rank() atadığı numaraları tekrarlayın. Bir bölümdeki her satır için row_number() farklı bir değer olmalıdır. rank() ve dense_rank() arasındaki fark, ikinci sayı "atlama" değildir. sorgu denemede için

:

dense_rank() over (partition by Username, Game order by ct."date") as "Attempts" 

Sen tarafından bölüm yoktur ve bu arada, aynı alana göre sırayla; İhtiyaç olsaydı, sadece sipariş vermek yeterli olurdu. Burada değil.

+3

Örnekte olduğu gibi, kullanıcı adının/oyunun sadece bir kombinasyonu, her satırın ifadenizle farklı bir row_number elde edecektir (row_number() asla çift sayı üretmez). 'Dense_rank() üzerinden olmalıdır (Kullanıcı adı, bölüm tarafından "ct." Tarih "bölümüne göre)' –

+1

@a_horse_with_no_name oh sevgili oldukça doğru - Bölümlemeye odaklanmıştım; teşekkür ederim. –

+0

"Partition by" maddesinin birden fazla sütunu kabul edebileceğini ve ayrıca yanlış bölümlenmiş olduğunu hayal edebilecek kadar yaratıcı değildim. ikinize de teşekkürler! – user1951677