Sql server 在SQL Server列中查找n个特定值的所有行

Sql server 在SQL Server列中查找n个特定值的所有行,sql-server,Sql Server,首先,为我的语法道歉(英语不是我的第一语言) 所以我一直被困在这个特殊的问题上,我不知道如何解决它。我试着在谷歌、Youtube和其他任何地方搜索,但似乎找不到任何有用的东西。我找不到有同样问题的问题,但如果以前有人问过我,我很抱歉,-我就是找不到任何问题 所以我在用两张桌子。首先我看着桌子 学生 PERSON_ID ENROLL_PERIOD PROGRAM_TYPE_LETTER PROGRAM_TYPE_NAME STUDENT_ID ---------------------

首先,为我的语法道歉(英语不是我的第一语言)

所以我一直被困在这个特殊的问题上,我不知道如何解决它。我试着在谷歌、Youtube和其他任何地方搜索,但似乎找不到任何有用的东西。我找不到有同样问题的问题,但如果以前有人问过我,我很抱歉,-我就是找不到任何问题

所以我在用两张桌子。首先我看着桌子

学生

PERSON_ID   ENROLL_PERIOD   PROGRAM_TYPE_LETTER PROGRAM_TYPE_NAME   STUDENT_ID
-------------------------------------------------------------------------------
12401       109                 B               Bachelor            116901
15668       124                 B               Bachelor            147068
22671       132                 B               Bachelor            213071
22921       133                 B               Bachelor            215821
该表中还有其他几列,但它们与任务无关,因此我没有将它们包括在这里(这是一个相当大的表)

以及另一张表,等级

PERSON_ID   GRADE   GRADE_DATE  GRADE_TYPE
-------------------------------------------
2308133      7      16-06-26        p         
2308133     10      18-01-24        p         
2308133      4      16-02-01        p         
2308133      7      15-06-29        p          
(这些只是桌子的一小部分)。我需要找到100名最迟到学生和100名未迟到学生的成绩数据。延迟学生是指在学士学位上注册了7个或更多学期,在硕士学位上注册了5个或更多学期的学生。注册期间显示学生注册的时间。例如,注册期138意味着该学生是在2018年秋季学期注册的。137是2018年春季学期,136是2017年秋季学期,135=2017年春季学期,依此类推

到目前为止,我已经找到了100名最迟到的学生

SELECT TOP 99 
    students.person_id, MIN(enroll_period) AS delayed 
FROM 
    students   
WHERE 
    enroll_period < '135' 
    AND program_type_letter = 'M' OR enroll_period < '133' 
    AND program_type_letter = 'b'  
GROUP BY 
    students.person_id 
ORDER BY 
    delayed
选择前99名
students.person\u id,MIN(注册期)延迟
从…起
学生
哪里
注册期<'135'
课程类型字母='M'或注册周期<'133'
程序类型字母='b'
分组
学生个人识别码
订购人
延迟
我还知道如何加入表并获得我想要的三列(person\u id、enroll\u period和grades),但我无法找到找到100个特定person\u id的所有成绩数据。我的问题是,在学生表中,每个人的ID只出现一次。因此,每一行都有一个不同的person\u ID。但是在grades表中,每个person\u ID有许多行(针对特定学生的分数)

我似乎找不到一种方法可以给我那些特定的100人ID,同时允许他们为所有的分数“给出”几行。我希望我有道理。我对SQL Server完全陌生,所以我一直在尝试基本上解决这个问题。我知道了如何使用完整的外部联接来联接这两个表,但是找不到一种方法来为我想要的100个person_id提取所有行。至于现在,我已经习惯了手工操作

SELECT TOP 4774 
    students.person_id, students.enroll_period, grade 
FROM 
    grades
FULL OUTER JOIN 
    students ON grades.person_id = students.person_id
WHERE 
    enroll_period < '135' 
    AND program_type_letter = 'M' OR enroll_period < '133' 
    AND program_type_letter = 'b' 
ORDER BY 
    students.enroll_period
选择前4774名
students.person\u id,students.enroll\u期间,年级
从…起
分数
完全外接
年级学生.person\u id=学生.person\u id
哪里
注册期<'135'
课程类型字母='M'或注册周期<'133'
程序类型字母='b'
订购人
学生。注册期
通过手动,我的意思是我通过查看第一个代码中找到的100个person_ID,然后在SELECT TOP number中添加越来越多的行,直到我到达最后一个100个person_ID的行的末尾,手动找到了所有4774行。我真的希望我在这里讲得有道理


我在网上找到的所有解决方案都只适用于为一个特定值提取所有行(如果我必须找到5个人名,这很酷,但当我必须找到100个人名时就没那么多了),或者如果你需要从第100行提取100行,例如从第100行到第200行。非常感谢您的帮助。

我想您正在寻找这样的嵌套查询:

select * from (
SELECT TOP 99 
    students.person_id, MIN(enroll_period) AS delayed 
FROM 
    students   
WHERE 
    enroll_period < '135' 
    AND program_type_letter = 'M' OR enroll_period < '133' 
    AND program_type_letter = 'b'  
GROUP BY 
    students.person_id )a
left join grades b on a.person_id=b.person_id
从中选择*(
选择前99名
students.person\u id,MIN(注册期)延迟
从…起
学生
哪里
注册期<'135'
课程类型字母='M'或注册周期<'133'
程序类型字母='b'
分组
学生。个人(id)a
左连接a.person\u id=b.person\u id上的b级

我想您正在寻找下面这样的嵌套查询-这对您有用吗?这正是我所需要的!非常感谢你!很高兴我能帮忙!