2011-09-30 23 views
10

Ben bir birim_id oid, zaman zaman damgası, diag bytea ile basit bir tablo var. Birincil anahtar hem zaman hem de unit_id birleşimidir.Tüm sütunları seçer ama bir sütuna göre gruplandır

Bu sorgunun arkasındaki fikir, her benzersiz birim_id için en son satırı (en büyük zaman damgası) almaktır. Ancak her bir unit_id için son zamanların satırları her zaman iade edilmez.

Gerçekten sadece unit_id ile gruplamak istiyorum, ancak postgres bunu seçmemi de, diag da kullanmamı sağlıyor.

SELECT DISTINCT ON(unit_id) max(time) as time, diag, unit_id 
FROM diagnostics.unit_diag_history 
GROUP BY unit_id, diag 

cevap

14

! Size BY yerelleştirilmiş GRUP yaklaşık window functions yerine düşünmeye başlamalıdır istediğini düşünmeye başlamak her zaman.

select unit_id, time, diag 
from (
    select unit_id, time, diag, 
      rank() over (partition by unit_id order by time desc) as rank 
    from diagnostics.unit_diag_history 
) as dt 
where rank = 1 

Sen sürekli yanı bağları kırmak için SİPARİŞ BY şey eklemek isteyebilirsiniz ama bu genel tekniğini değiştirmek olmaz:

Ben böyle bir şey peşinde olduğunu düşünüyorum.

+0

Alt seçim kullanmadan bunu yapabilir miyiz? – metdos

+0

@metdos: Kafamın üstünde bir şey düşünemiyorum ama bir yolu olabilir. Türetilmiş tablolarda sorun nedir? –

9

Orijinal tabloyla gruplandırılmış seçme katılabilirsiniz:

SELECT d.time, d.diag, d.unit_id 
FROM(
    SELECT unit_id, max(time) as max_time 
    FROM diagnostics.unit_diag_history 
    GROUP BY unit_id 
) s JOIN diagnostics.unit_diag_history d 
ON s.unit_id = d.unit_id AND s.max_time = d.time 
+0

Bu, herhangi bir şekilde (MySQL'den gelme) bana yardımcı olan Googling'in birkaç gün içinde bulduğum tek yanıttır. – Adrian

İlgili konular