-1

我想找到学校最小班级中年龄最大的人

我有一张这样的桌子

学校班级 DOB 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

我需要将结果表作为

学校班级 DOB 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)并从最低班级开始计数,然后是最早的 DOB)。

DENSE_RANK 允许学生分享生日

于 2013-07-16T11:18:52.243 回答
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 回答
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 回答