Student
SQL Server に次の列を持つテーブルがあります。
[ID], [Age], [Level]
に表示される各 age 値を返し、Students
最も頻繁に表示されるレベル値を見つけるクエリが必要です。たとえば、'a'
'b' または 'c' よりも 18 歳のレベルの学生が多い場合、ペアを出力する必要があります(18, a)
。
私は SQL Server を初めて使用するので、ネストされたクエリを使用した簡単な回答が必要です。
Student
SQL Server に次の列を持つテーブルがあります。
[ID], [Age], [Level]
に表示される各 age 値を返し、Students
最も頻繁に表示されるレベル値を見つけるクエリが必要です。たとえば、'a'
'b' または 'c' よりも 18 歳のレベルの学生が多い場合、ペアを出力する必要があります(18, a)
。
私は SQL Server を初めて使用するので、ネストされたクエリを使用した簡単な回答が必要です。
ウィンドウ関数を使用してこれを行うことができます。
select t.*
from (select age, level, count(*) as cnt,
row_number() over (partition by age order by count(*) desc) as seqnum
from student s
group by age, level
) t
where seqnum = 1;
内部クエリはデータを集計して、各年齢のレベル数をカウントします。はrow_number()
、年齢ごとにこれらを列挙します (partition by
最初に最大のもの)。次に、where
句は最大値を選択します。
同数の場合、これは値の 1 つだけを返します。それらすべてが必要な場合は、のrank()
代わりに使用しrow_number()
ます。
with combinations as (
select age, level, count(*) occurrences
from Student
group by age, level
)
select age, level
from combinations c
where occurrences = (select max(occurrences)
from combinations
where age = c.age)
これにより、Students テーブル内のすべての年齢とレベルの組み合わせが検出され、各レベルの出現回数がカウントされます。次に、年齢とレベルの組み合わせごとに、その年齢とレベルの組み合わせで出現率が最も高いものを見つけます。その行の年齢とレベルを返します。
これには、SQL Server に縛られないという利点があります。これは標準的な SQL です。ただし、Gordon が指摘したようなウィンドウ関数は、SQL Server でパフォーマンスが向上する可能性があります。
別のオプションですが、新しいバージョンの sql-server が必要になります。
;WITH x AS
(
SELECT age,
level,
occurrences = COUNT(*)
FROM Student
GROUP BY age,
level
)
SELECT *
FROM x x
WHERE EXISTS (
SELECT *
FROM x y
WHERE x.occurrences > y.occurrences
)
年齢に複数のレベルがある年齢/レベルの組み合わせのみを返すため、質問に完全には答えていないことに気付きました。
結果セットに単一レベルの年齢も含まれるように、誰かがそれを修正するのを助けることができるかもしれません: http://sqlfiddle.com/#!3/d597b/9