SQL帮助,限制行数

时间:2013-12-04 22:03:03

标签: sql sql-server aggregate-functions

鉴于表:学生

| 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 |

我该怎么办?非常感谢您的帮助和建议:)谢谢!

3 个答案:

答案 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