2015-02-13 19 views
6

other posts about using the median() window function in Redshift'u gördüm, ancak sonunda bir grubu olan bir sorgu ile nasıl kullanırsınız?Grup ile medyanı AWS Redshift içinde hesapla

Course | Subject | Num_Students 
------------------------------- 
    1 | Math |  4 
    2 | Math |  6 
    3 | Math |  10 
    4 | Science |  2 
    5 | Science |  10 
    6 | Science |  12 

ben her ders konusu için öğrencilerin medyan numarası almak istiyorum: Örneğin

, masa kursu varsayalım. Bu ise (

SELECT 
subject, median(num_students) over() 
FROM 
course 
GROUP BY 1 
; 

Ama özne ve benzeri konularda arasında aynı medyan sayı her geçtiği listelenmektedir:

Subject | Median 
----------------------- 
Math  |  6 
Science |  10 

denedim: Ben şu sonucu verir bir sorgu yazarsınız nasıl sahte veriler döndürür gerçek değeri 6 değil bu yüzden, ama sadece o) tüm denekler arasında aynıdır gösterilen:

Subject | Median 
----------------------- 
Math  |  6 
Math  |  6 
Math  |  6 
Science |  6 
Science |  6 
Science |  6 

cevap

1

Sadece "over()" bölümünü çıkarmanız gerekiyor.

SELECT subject, median(num_students) FROM course GROUP BY 1; 
+0

Hem bu cevap hem de @ isaac.hazan'ın cevabı doğru. Bu cevap basit medyan() fonksiyonunu kullanır, isaac.hazan medyan pencere fonksiyonunu kullanır (daha karmaşık senaryolarda faydalı olabilir) – clavid

0

Sen penceresinde bir bölümü tanımlamadınız. OVER() yerine OVER(PARTITION BY subject)'a ihtiyacınız var.

SELECT distinct 
subject, median(num_students) over(partition by Subject) 
FROM 
course 
order by Subject; 
+0

Bahşiş için teşekkürler Jakub. Bunu yaptığımda, num_students'a göre gruplandırmam gerektiğini söylüyor. Bunu yaptığımda, her konu için bana farklı bir medyan verir, ancak aynı konu sadece bir kez yerine birden çok kez görünür ... – clavid

+0

@clavid "GROUP BY" öğesini bırakın ve "DISTINCT" komutunu kullanın ya da hesaplamak için bir alt sorgu kullanın dış sorguda medyan ve grup. –

4

şu size aradığınız tam olarak sonuç alırsınız:

WITH subject_numstudents_medianstudents AS (
    SELECT 
     subject 
     , num_students 
     , median(num_students) over (partition BY subject) AS median_students 
    FROM 
     course 
) 
SELECT 
    subject 
    , median_students 
    , avg(num_students) as avg_students 
FROM subject_numstudents_medianstudents 
GROUP BY 1, 2 
0

Diyelim ki avg() kullanarak, alt sorgu kullanmak gerekir gibi konuya göre, diğer gruplamalar hesaplamak istediğinizi varsayalım: