2016-04-24 7 views
3

meiner Anfrage Hier ist also so weit:Vergleicht man zwei Werte in Postgres in einer Abfrage

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 

Und hier ist die Ausgabe:

enter image description here

Nun, was ich nur zu tun, ich versuche, ist Holen Sie sich die häufigste Note für eine Klasse zurück. Also muss ich Softwareentwicklung I mit der Note A ausschneiden, denn A ist die häufigste Note in der Klasse. Aber ich weiß nicht, wie man die Zählwerte vergleicht. Jede Hilfe wäre wunderbar.

Antwort

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

Wenn Sie die Zählung nicht brauchen (basierend auf Ihre Kommentare) Sie könnte so etwas wie dieses

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; 

Die folgende Abfrage versuchen wird, auch der Graf

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

Ich mag dieses eine viel. Ich hatte vor einiger Zeit einen DB-Admin, der mir diese Lösung zeigte und vergaß es sofort. Ich muss wirklich die 'row_number() über (Partition durch ... order by ...)' Syntax in den Speicher übergeben. – jwatts1980

+0

Hmm, ich habe gerade bemerkt, dass du nicht die Anzahl der Grade-Vorkommen bekommst. Das ist einer der Schlüssel zur benötigten Antwort. – jwatts1980

+0

Ja, Sie können nicht, aber OP erwähnt in einem Kommentar, dass er die Note statt der Zählung wollte .. so schlug ich dies vor ... Wenn Sie die Anzahl benötigen, müssten Sie diese Abfrage mit einer anderen Abfrage, die den Titel und bekommt zählen und dann stimmen sie überein. Vielleicht gibt es einen anderen Weg, die Zählung zu erhalten, indem Sie die gleiche Abfrage verwenden .. ich weiß nicht ... – cableload

0

eine weitere gemeinsame Lösung erhalten zu diesem Problem ist die Tabelle wieder auf sich selbst zu verbinden. 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 

Aber ich denke, @cableload ‚s Antwort ist viel besser, wenn es gezwickt werden kann die maximale Anzahl von Vorkommen der Klasse zu betrachten.

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; 
Verwandte Themen