最近在做一个小项目时,有一这样的需求:查询最近30天内正确率大于60%的阅读记录, 每天只显示符合条件的速度最高的那个.
现有数据库表字段:
写成存储过程如下:
create PROCEDURE usp_getDataByRange
@range int
AS
select * from
(SELECT id, RD_User, RD_OrginalArticle, RD_RightWords, RD_DictationArticle,
RD_LastReadIndex, RD_Speed, RD_ReadTime, RD_DictationTime, RD_SumTime,
RD_PrecisionRate, CONVERT(VARCHAR(50) ,RD_TestTime, 101) as Time,
case
when RD_PrecisionRate=max(RD_PrecisionRate) over(partition BY CONVERT(VARCHAR(50) ,RD_TestTime, 101))
then 'zuigao'
end as ZUI
FROM OR_ReadingDetails
WHERE (DATEDIFF(day,RD_TestTime,GETDATE()) <= @range) and RD_PrecisionRate>=60 ) as temp
where temp.zui is not null .
这样的一个缺陷在于:如果一天当中有两条记录都是最高的话将会被查出来。