鉴于表:学生
| course | Name|
---------------
| science | A |
| math | B |
| english | A |
| physics | A |
| chem | A |
| bio | B |
| geology | B |
| history | C |
我将按字母顺序排列此表。
Tmp表: ordered_student
| course | Name|
---------------
| bio | B |
| chem | A |
| english | A |
| geology | B |
| history | C |
| math | B |
| physics | A |
| science | A |
使用以下代码
select Name, COUNT(*) as count from student group by Name
我能够创建临时表
Tmp表: num_course_per_student
| Name | count|
---------------
| A| 4 |
| B| 3 |
| C| 1 |
目标
比方说,学生只能参加2门课程。如果学生参加2门以上的课程,学生将参加前2门课程。
我应该返回以下内容..
| course | Name|
---------------
| bio | B |
| chem | A |
| english | A |
| geology | B |
| history | C |
我该怎么办?非常感谢您的帮助和建议:)谢谢!
答案 0 :(得分:1)
试试这个:
; with temp as (
select
DENSE_RANK() OVER (PARTITION BY Name ORDER BY Course) AS Rank,
Name,
course
from student
)
SELECT Course, Name FROM temp WHERE Rank<=2
order by Course
结果:
Course Name
bio B
chem A
english A
geology B
history C
答案 1 :(得分:1)
这应该这样做:
WITH s AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY name ORDER BY course) rank,
* FROM student
)
SELECT course, name FROM s
WHERE RANK <= 2
ORDER BY course
输出:
course name
------- ----
bio B
chem A
english A
geology B
history C
看到它正常工作here。
答案 2 :(得分:0)
SELECT
course,
Name
FROM (SELECT DISTINCT Name FROM student) t1
CROSS APPLY (SELECT TOP 2 course FROM student WHERE Name = t1.Name ORDER BY course) t2