2010-08-03 15 views
55

Bir PostgreSQL sorgusu tarafından döndürülen her kayıt için gözlem numarasını göstermek istiyorum.PostgreSQL sorgusunda satır numaraları nasıl gösterilir?

Sanırım 8.4 pencere fonksiyonları bu özelliği gerçekleştirebilir. Sipariş gerekli değilse

+0

Gelecekte bu konuya geri dönebilmem için kendi sorumu favorimden geçirmem gerekiyor :) – vol7ron

+24

+1 Bu tamamen soru, cevap ve tek bir kişiden oluşan iletişim kutusundan oluşan ilk soru. . – Xeoncross

+2

:) Xeon, beni güldürdün. Yine de bu soruya her seferinde geri dönüyorum. – vol7ron

cevap

86
select row_number() over (order by <field> nulls last) as rownum, * 
from  foo_tbl 
order by <field> 

, bu cevap da basitleştirilmiş edilebilir: sürümleri için

select row_number() over(), * -- notice: no fields are needed 
from foo_tbl 
+1

Görünüşe göre eğer 'over() 'yaparsanız, o zaman her zaman (1 2 3 4 ...' * gibi) belirli bir sonucun sıralaması için (örneğin sonuçları yeniden düzenleyen dış sorgular varsa) http: //stackoverflow.com/a/4812038/32453, siparişin dışına çıkar, bu nedenle bir 'sipariş' eklemek, bu durumlarda yararlı olabilir (ya da ilk örnekte olduğu gibi, boş değerleri saymak istemiyorsanız). FWIW – rogerdpack

+1

Bu gerçekten harika - yeni başlayanlar için, bunun nasıl çalıştığını biraz inceliyor olabilir mi? –

+2

@ zthomas.nc bir pencere fonksiyonudur.Bir tanıdık bir cam pencere düşünün.İsterseniz, bu pencereyi daha küçük bölmelere bölebilirsiniz. (kareler), tüm sonuçlar hala benzersizdir, ancak kareler arasında bölünür.Bu bölme, bir bölme olarak bilinir, yani yukarıda() 'nin üstündüğü şeydir. Eğer herhangi bir koşul sağlamazsanız, Pencerenin tamamı için tek bir pencere olurdu. Pencere fonksiyonları 'calcul yapabildikleri için eşsizdir. Bütün bir sonuç kümesi yerine bir çerçevenin satırları boyunca atraksiyonlar. Yani, "row_number" öğesini cinsiyetle yapmak istiyorsanız, cinsiyete göre bölümünüzü kullanabilirsiniz. – vol7ron

5

önce 8,4:

SELECT count(*) rownum, foo.* 
FROM  datatable foo 
JOIN  datatable bar 
      ON (foo.pk_id < bar.pk_id) 
GROUP BY foo.pk_id, foo.a, foo.b 
ORDER BY rownum 
; 

-- if there isn't a single unique/primary key field, you can concatenate fields 
-- Example: ON (foo.a||foo.b||foo.c < bar.a||bar.b||bar.c) 

Umut bu kimse yardımcı olur.

+0

Bu yöntem, herhangi bir SQL Standard uyumlu veritabanı – vol7ron

+0

üzerinde çalışmalıdır. "Null" değerlerinin "null" ile eşleşmesi gerektiğini unutmayın. Böylece, bir "coalesce()" kullanılmaya ihtiyaç duyulabilir. – vol7ron

+2

Pencere işlevleri, SQL: 2003 standardının bir parçasıdır. –

İlgili konular