2016-04-24 8 views
3

中のPostgresで2つの値を比較すると、これまでのところ、私のクエリです:は、だからここ1つのクエリ

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のグレードでソフトウェア開発Iを取り除く必要があります。しかし、私はカウント値を比較する方法を知らない。どんな助けも素晴らしいだろう。あなたは(あなたのコメントに基づいて)、カウントが必要いけない場合

答えて

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,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

私はこれをたくさん好きです。私はDB管理者にこの解決策を提示してくれましたが、すぐにそれを忘れました。私は実際に 'row_number()over(partition by ... order by ...)'構文をメモリにコミットする必要があります。 – jwatts1980

+0

ええと、私はあなたが学年の出現の数を取得していないことに気づいただけです。それが必要な答えの鍵の1つです。 – jwatts1980

+0

はい、あなたはできませんが、OPはカウントではなくグレードを求めているというコメントに言及しています。私はこれを提案しました。カウントが必要な場合は、このクエリをタイトルとカウントし、次に一致するかもしれません。たぶん、同じクエリを使用してカウントを取得する別の方法です..私は知らない... – cableload

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; 

ような何かを試みることができますこの問題は、テーブル自体に戻ってきています。 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; 
関連する問題