2

StudentSQL Server に次の列を持つテーブルがあります。

[ID], [Age], [Level] 

に表示される各 age 値を返し、Students最も頻繁に表示されるレベル値を見つけるクエリが必要です。たとえば、'a''b' または 'c' よりも 18 歳のレベルの学生が多い場合、ペアを出力する必要があります(18, a)

私は SQL Server を初めて使用するので、ネストされたクエリを使用した簡単な回答が必要です。

4

4 に答える 4

5

ウィンドウ関数を使用してこれを行うことができます。

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()ます。

于 2013-06-01T15:04:15.113 に答える
1
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 でパフォーマンスが向上する可能性があります。

于 2013-06-01T16:22:51.143 に答える
1

別のオプションですが、新しいバージョンの 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

于 2013-06-01T18:38:20.687 に答える