获取MAX计数但保留重复的计算值(如果最高)

时间:2016-12-04 19:57:26

标签: sql sql-server-2008 max

我有下表,我正在使用SQL Server 2008

BayNo   FixDateTime         FixType 
1       04/05/2015 16:15:00 tyre change 
1       12/05/2015 00:15:00 oil change  
1       12/05/2015 08:15:00 engine tuning   
1       04/05/2016 08:11:00 car tuning  
2       13/05/2015 19:30:00 puncture    
2       14/05/2015 08:00:00 light repair    
2       15/05/2015 10:30:00 super op    
2       20/05/2015 12:30:00 wiper change    
2       12/05/2016 09:30:00 denting 
2       12/05/2016 10:30:00 wiper repair    
2       12/06/2016 10:30:00 exhaust repair  
4       12/05/2016 05:30:00 stereo unlock   
4       17/05/2016 15:05:00 door handle repair  

在任何给定的日期需要找到在给定托架编号上进行的最大数量的修复,如果重复计算的数字,那么它也应该出现在结果集中 所以希望看到结果集如下

BayNo   FixDateTime           noOfFixes 
1       12/05/2015 00:15:00   2 
2       12/05/2016 09:30:00   2 
4       12/05/2016 05:30:00   1 
4       17/05/2016 15:05:00   1 

我设法得到每个的计数,但努力获得最大值并保持计算的最高重复值。请有人帮忙吗

2 个答案:

答案 0 :(得分:0)

使用窗口功能。

通过bayno获取每一天的计数,并找到每个bayno每天的最小修复时间。

然后使用dense_rank根据修正数计算每个bayno的排名最高的行。

最后获得排名最高的行。

select distinct bayno,minfixdatetime,no_of_fixes
from (
select bayno,minfixdatetime,no_of_fixes
,dense_rank() over(partition by bayno order by no_of_fixes desc) rnk
from (
select t.*, 
count(*) over(partition by bayno,cast(fixdatetime as date)) no_of_fixes,
min(fixdatetime) over(partition by bayno,cast(fixdatetime as date)) minfixdatetime
from tablename t
    ) x
) y 
where rnk = 1

Sample Demo

答案 1 :(得分:0)

您正在寻找rank()dense_rank()。我会这样查询:

select bayno, thedate, numFixes
from (select bayno, cast(fixdatetime) as date) as thedate,
             count(*) as numFixes,
             rank() over (partition by cast(fixdatetime as date) order by count(*) desc) as seqnum
      from t
      group by bayno, cast(fixdatetime as date)
     ) b
where seqnum = 1;

请注意,这会返回有问题的日期。日期没有时间组件。