2013-07-01 9 views
13

ile birden çok (toplu olmayan işlev) sütun seçin Birden çok yinelenen değere sahip başka bir benzersiz kimlik sütunu tarafından gruplandırılırken, bir sütundan maksimum değeri seçmeye çalışıyorum. Böyle bir tablo döndürürGROUP BY

SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent 
FROM c 
GROUP BY c.mukey; 

:

mukey | ComponentPercent 
65789 | 20 
65790 | 26 
65791 | 50 
65792 | 90 

ı diğer sütunları eklemek mümkün olmak istiyorum Bu kullanarak sadece çalışıyor

mukey | comppct_r | name | type 
65789 | 20  | a | 7n 
65789 | 15  | b | 8m 
65789 | 1   | c | 1o 
65790 | 10  | a | 7n 
65790 | 26  | b | 8m 
65790 | 5   | c | 1o 
... 

: bir şey gibi özgün veritabanı görünüyor GROUP BY işlevini etkilemeden, çıktı sütununa ad ve tür gibi sütunları dahil etmek için:

mukey | comppct_r | name | type 
65789 | 20  | a | 7n 
65790 | 26  | b | 8m 
65791 | 50  | c | 7n 
65792 | 90  | d | 7n 

Ancak, her zaman select deyimi ile bir toplama işlevini kullanmam gerektiğini söyleyen bir hata verir. Bunu yapmaya nasıl devam etmeliyim?

+1

beklenen sonucu nedir? –

+0

Bunu ekledi, teşekkürler – Dylansq

cevap

17

Kendine sorun var.

select c.mukey, c.comppct_r, c.name, c.type 
from c yt 
inner join(
    select c.mukey, max(c.comppct_r) comppct_r 
    from c 
    group by c.mukey 
) ss on c.mukey = ss.mukey and c.comppct_r= ss.comppct_r 

Başka bir olası yaklaşım, aynı çıkışı: Bu olası çözümlerden biridir

select c1.* 
from c c1 
left outer join c c2 
on (c1.mukey = c2.mukey and c1.comppct_r < c2.comppct_r) 
where c2.mukey is null; 

burada konu hakkında kapsamlı ve açıklayıcı cevap var: SQL Select only rows with Max Value on a Column

+0

"ss on c.mukey = ss.mukey ve c.comppct_r = ss.comppct_r" içindeki "ss" nedir? – Dylansq

+1

'ss, türetilmiş tabloya verdiğim addır (parantez arasında bildirilen yapı) –

+0

ikinci çözüm nasıl çalışır? Benim durumumda hiçbir şey yapmaz - sadece tüm satırları görüntüler. Görünüşe göre bu yaklaşım grubu da kullanmalıdır ... –

0

şöyle bir sanal tablo kullanmayı deneyin:

SELECT vt.*,c.name FROM(
SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent 
FROM c 
GROUP BY c.muke; 
) as VT, c 
WHERE VT.mukey = c.mukey 
0

Sadece GROUP BY ekleyerek veya bir toplama işlevi uygulamadan başka sütunlar eklenemez. Bunun nedeni, bir sütunun değerlerinin bir grup içinde farklı olabilmesidir.

mukey | comppct_r | name | type 
65789 | 20  | a | 7n 
65789 | 20  | b | 9f 

Nasıl toplu grup sütunlar name ve type için aşağıdaki gibi görünmelidir: Örneğin, iki satır olabilir? isim ve türü her zaman bir grup içinde aynı ise

, sadece GROUP BY maddeye ekleyin:

SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent 
FROM c 
GROUP BY c.muke, c.name, c.type; 
1

olmayan herhangi agrega sütun Group By cümlede olmalıdır .. neden ?? Şimdi bu sorgu yalnızca bir satırı sonuçlanacaktır

select x1,y1,max(z1) from t1 group by y1; 

ama ne x1 değeri olmalıdır ??:

    t1 
x1   y1   z1 
1   2    5 
2   2    7 

Şimdi böyle bir sorgu yazmaya çalışıyoruz Bu temelde tanımlanmamış bir davranıştır. Bunu aşmak için, SQL bu sorguyu çözecektir.

Şimdi, noktaya gelince, x1 için toplama işlevini seçebilir veya x1'i grup olarak ekleyebilirsiniz. Tüm bunların sizin ihtiyacınıza bağlı olduğunu unutmayın.

Z1 gruplandırmasında y1'e göre kümelenmiş tüm satırları istiyorsanız, SubQ yaklaşımını kullanabilirsiniz.

Select x1,y1,(select max(z1) from t1 where tt.y1=y1 group by y1) 
from t1 tt; 

Bu gibi bir sonuç üretecektir:

    t1 
x1   y1   max(z1) 
1   2    7 
2   2    7