2

我有一个表 Student 字段:Student_id, Student_Name, Mark, Branch

我想在单个查询中获得每个分支的第 n 个最高标记和名称。是否可以?

例如,如果数据是

S1   |  Amir  |  EC  |  121
S2   |  Ewe   |  EC  |  123
S3   |  Haye  |  EC  |  45
S4   |  Mark  |  EC  |  145
S5   |  Tom   |  CS  |  152
S6   |  Hudd  |  CS  |  218
S7   |  Ken   |  CS  |  48
S8   |  Ben   |  CS  |  15
S9   |  Wode  |  CS  |  123
S10  |  Kayle |  IT  |  125
S11  |  Den   |  IT  |  120
S12  |  Noy   |  IT  |  126

我选择在每个分支中显示第三高的标记,输出应该是这样的

S1   | Amir   | EC   | 121
S9   | Wode   | CS   | 123
S11  | Den    | IT   | 120
4

5 回答 5

1

如果 MySQL 具有像其他几个答案所示的窗口函数,这将容易得多。但他们没有,所以你可以使用类似下面的东西:

select student_id,
      student_name,
      branch,
      mark
from
(
  select student_id,
      student_name,
      branch,
      mark,
      @num := if(@branch = `branch`, @num + 1, 1) as group_row_number,
      @branch := `branch` as dummy,
      overall_row_num
  from
  (
    select student_id,
      student_name,
      branch,
      mark,
      @rn:=@rn+1 overall_row_num
    from student, (SELECT @rn:=0) r
    order by convert(replace(student_id, 'S', ''), signed) 
  ) src
  order by branch, mark desc
) grp
where group_row_number = 3
order by overall_row_num

请参阅带有演示的 SQL Fiddle

结果将是:

| STUDENT_ID | STUDENT_NAME | BRANCH | MARK |
---------------------------------------------
|         S1 |         Amir |     EC |  121 |
|         S9 |         Wode |     CS |  123 |
|        S11 |          Den |     IT |  120 |
于 2012-12-14T15:16:41.610 回答
0

最大限度()

select branch, MAX(mark) as 'highest mark' from Student group by branch;
于 2012-12-14T04:56:20.590 回答
0

MySQl不支持CTE并且rownumber,所以你做了这样的事情: - 制作一个临时表,将数据插入其中然后选择并最后删除临时表..

create table #temp(branch varchar(30),mark int,row_numbers int)
Insert into #temp
SELECT a.branch, a.mark, count(*) as row_numbers FROM student a
JOIN student b ON a.branch = b.branch AND a.mark <= b.mark
GROUP BY  a.mark,a.branch
Order by  a.mark desc

select branch,mark from #temp where row_numbers=2

drop table #temp 

这是针对 SQL SERVER 的:-

;WITH CTE AS
(
SELECT  Branch,mark, ROW_NUMBER() OVER (PARTITION BY Branch ORDER BY mark DESC) AS RowNum
FROM 
student
)
SELECT Branch,mark from cte
WHERE RowNum = 2

这将给出假设第二个最高分的分支,您可以相应地选择任何第 N 级。

希望能帮助到你 :-

于 2012-12-14T05:37:57.033 回答
0

这个在甲骨文中工作

select Student_id,Student_Name,Mark,Branch from (
    select  Student_id,Student_Name,Mark,Branch,dense_rank() over (partition by Branch order by Mark desc) rnk
    from Student ) where rnk=nth_value;

nth_value:=需要的第 n 个最高标记。请检查这个 sqlfiddle:http ://sqlfiddle.com/#!4/7b559/3

于 2012-12-14T05:55:38.253 回答
-1

您可以使用 Limit 获得 n 个最高市场 ( limit 1,1 will give you 2nd highest, set as per your requirement)

SELECT mark, name
FROM student ORDER BY mark 
DESC LIMIT 1,1
于 2012-12-14T04:54:31.763 回答