2016-04-24 417 views
3

因此,這裏是我的查詢到目前爲止:在一個查詢中Postgres的兩個值進行比較

Select 
    class.title, studentClass.grade, count(studentClass.grade) 
from 
    classOffering 
inner join 
    studentClass on classOffering.classID = studentClass.classID 
inner join 
    class on classOffering.classID = class.classID 
group by 
    class.title, studentClass.grade 
order by 
    count(studentClass.grade) desc 

這裏是輸出:

enter image description here

現在我所要做的僅僅是找回班級中最常見的成績。所以我需要削減軟件開發我與B的等級,因爲A是班上最頻繁的等級。但我不知道如何比較計數值。任何幫助將是美好的。

回答

0
Select tableView.title, tableView.grade from (Select class.title as title, studentClass.grade as grade, count(studentClass.grade) as count from classOffering 
inner join studentClass on classOffering.classID = studentClass.classID 
inner join class on classOffering.classID = class.classID 
group by class.title, studentClass.grade 
order by count(studentClass.grade) desc)as tableView group by tableView.title, tableView.grade; 
0

如果你不需要計數(根據您的意見),你可以嘗試這樣的事情

select a.title,a.grade from 
(Select class.title, studentClass.grade, 
row_number() over (partition by class.title order by studentClass.grade) as rn 
from classOffering inner join studentClass on classOffering.classID = studentClass.classID 
inner join class on classOffering.classID = class.classID 
group by class.title, studentClass.grade)a 
where a.rn=1; 

下面的查詢也將獲得數

select a.title,a.grade,a.gradeCount from 
    (Select class.title, studentClass.grade, 
    count(studentClass.grade) over (partition by class.title) as gradeCount 
    row_number() over (partition by class.title order by studentClass.grade) as rn 
    from classOffering inner join studentClass on classOffering.classID = studentClass.classID 
    inner join class on classOffering.classID = class.classID 
    group by class.title, studentClass.grade)a 
    where a.rn=1; 
+0

我很喜歡這個。我有一位數據庫管理員向我展示了這個解決方案,並立即忘了它。我真的需要將'row_number()(語法... by ... by order by ...)'語法提交到內存。 – jwatts1980

+0

嗯,我剛剛注意到你沒有得到職業發生次數。這是所需答案的關鍵之一。 – jwatts1980

+0

是的,你不能,但是OP在評論中提到他想要成績而不是count ..所以我提出了這個...如果你需要計數,你將不得不加入這個查詢與另一個查詢獲得標題和計數,然後匹配它們。也許有另一種方法來通過使用相同的查詢來計數..我不知道... – cableload

0

另一種常見的解決方案這個問題就是將桌子重新連接到自己身上。 Here is a SQL Fiddle that tests this answer

SELECT T3.title, T3.grade, T2.maxcount 
FROM (
    SELECT title, max(count) as maxcount 
    FROM (
     Select class.title, studentClass.grade, count(studentClass.grade) as count 
     from classOffering 
     inner join studentClass on classOffering.classID = studentClass.classID 
     inner join class on classOffering.classID = class.classID 
     group by class.title, studentClass.grade 
    ) AS T1 
    GROUP BY title 
) AS T2 
JOIN (
    Select class.title, studentClass.grade, count(studentClass.grade) as count 
    from classOffering 
    inner join studentClass on classOffering.classID = studentClass.classID 
    inner join class on classOffering.classID = class.classID 
    group by class.title, studentClass.grade 
) AS T3 ON T2.title = T3.title AND T2.maxcount = T3.count 
ORDER BY T3.title, T3.grade, T2.maxcount 

但我認爲@cableload的回答是好多了,如果它可以被調整,以考慮級出現的最大數量。

0
WITH tableView1 as (Select class.title as title, studentClass.grade as grade, count(studentClass.grade) as count from classOffering inner join studentClass on classOffering.classID = studentClass.classID inner join class on classOffering.classID = class.classID group by class.title, studentClass.grade order by count(studentClass.grade) desc), 
tableView2 as (select title,max(count) as count from tableView1 group by title), 
tableView3 as (select tableView1.title as title,tableView1.grade as grade,tableView1.count as count from tableView1 inner join tableView2 on tableView1.title=tableView2.title AND tableView1.count=tableView2.count) select * from tableView3 order by title,grade,count;