-1

学校に存在する最小クラスの最年長者を見つけたい

このようなテーブルがあります

学校のクラスの生年月日 Stu_ID
1 1 2000-10-05 S007 1 1 2001-08-03 S006 1 2 2000-10-05 S005 1 2 2001-08-03 S004 2 3 2000-10-05 S003 2 4 2001-08-03 S002 2 4 2000-10-05 S001 2 5 2001-08-03 S009

結果テーブルを次のように取得する必要があります

学校のクラスの生年月日 Stu_ID
1 1 2000-08-03 S006 2 3 2000-10-05 S003

つまり、各学校の最小クラスの最年長者です。

4

3 に答える 3

1
SELECT
    School, Class, DOB, Stu_ID
FROM
    (
    SELECT
        School, Class, DOB, Stu_ID,
        DENSE_RANK() OVER (PARTITION BY School ORDER BY Class, DOB) AS rn
    FROM
        MyTable
    ) X
WHERE X.rn = 1

rn は学校 (PARTITION BY) ごとにリセットされ、最下位のクラスから順にカウントされ、次に最も古い生年月日がカウントされます)。

DENSE_RANK を使用すると、生徒は誕生日を共有できます

于 2013-07-16T11:18:52.243 に答える
0

ランキング機能を使用できます。

WITH CTE AS(
    SELECT School, Class, DOB, Stu_ID,
        RN = ROW_NUMBER() OVER (PARTITION BY School ORDER BY Class ASC)
    FROM dbo.Schools
)
SELECT School, Class, DOB, Stu_ID
FROM CTE WHERE RN = 1

デモ

于 2013-07-16T11:18:08.463 に答える
0

最良の方法は、ウィンドウ関数を使用して中間変数を計算することです。

select School, Class, DOB, Stu_ID 
from (select t.*,
             dense_rank(ClassCnt) over (partition by school) as ClassSizeRank
      from (select t.*,
                   count(*) over (partition by school, class) as ClassCnt,
                   row_number over (partition by school, class order by dob) as AgeSegnum
            from t
           ) t
     ) t
where ageseqnum = 1 and ClassSizeRank = 1;

このタイプのクエリに結合を使用することはお勧めしません。これが宿題/クラスの場合は、質問でそれを指定する必要があります。

于 2013-07-16T11:19:38.137 に答える