繁体   English   中英

在SQL表中查找最高分的存储过程

[英]Stored procedure to find Highest Scores in SQL table

+-------+-----------+-------+
| Name  |   Date    | Score |
+-------+-----------+-------+
| Name1 | 1/3/2016  |    80 |
| Name2 | 1/5/2016  |    76 |
| Name3 | 1/29/2016 |    77 |
| Name4 | 1/30/2016 |    40 |
| Name4 | 1/17/2016 |    79 |
| Name5 | 1/1/2016  |    90 |
| Name2 | 1/3/2016  |    79 |
| Name5 | 1/27/2016 |    92 |
| Name2 | 1/27/2016 |    99 |
| Name1 | 1/21/2016 |    93 |
| Name2 | 1/3/2016  |    70 |
| Name1 | 2/15/2016 |    80 |
| Name3 | 3/31/2016 |    84 |
+-------+-----------+-------+

我有此表,需要在给定的时间段内(即在2016年1月1日至2016年1月31日之间)找到每个名称的最高分数,并显示名称,日期和最高分数。

请帮忙! 谢谢-温贝托·戈斯(Humberto Goez)

您将遇到重复行的问题,因为您没有显示主键。 该查询可以工作,但是最好使用主键

当然,这只是SQL ...

SELECT Name, [Date], Score
FROM MyTable T1
WHERE T1.Score = (SELECT MAX(T2.Score) 
                  FROM MyTable T2 
                  WHERE T2.Name = T1.Name)
    AND [Date] >= @StartDate
    AND [Date] <= @EndDate

如果您使用的是SQL Server则可以使用:

DECLARE @start_date DATE = '2016-01-01T00:00:00'
       ,@end_date DATE = '2016-01-31T00:00:00';

SELECT TOP 1 WITH TIES [Name],[Date],[Score]
FROM tab_name t
WHERE [Date] BETWEEN @start_date AND @end_date
ORDER BY RANK() OVER(PARTITION BY Name ORDER BY Score DESC);

LiveDemo

CTE是一个很好的方法。 示例查询如下所示:

declare @StartDate datetime = '2016-01-01',
        @EndDate datetime = '2016-06-01'
;with scores as (
SELECT Name, [Date], Score,
row_number() over(partition by name /*start over each name*/ 
                  order by Score desc /*top first*/,[Date] /*earlier first*/) rn
FROM MyTable
)
select * from scores
where rn = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM