2017-06-22 53 views
1

我有一个包含大量应用程序和日期的表格。 我需要选择具有最高申请数量和一个月的一年。 我的表看起来像:如何在组内找到最高值?

CisloSmlouvy | DatumZadosti 
    121651566 | 3-1-2010 07:23:21 
    121651516 | 7-5-2011 08:23:21 
    121551567 | 1-9-2010 09:25:21 
    121651562 | 3-5-2017 17:23:21 

我想:

Best year | NumberOfApplications 
    2016  | 21565 
    Best month| NumberOfApplications 
    May  | 215 

我已经试过

;WITH resultset AS(
     SELECT 
      COUNT(CisloSmlouvy)  AS PocetSmluv 
      ,DATEPART(YYYY, CAST(DatumZadosti AS DATE)) AS [Year] 
      ,RN = RANK()OVER(PARTITION BY DATEPART(YYYY, CAST(DatumZadosti AS DATE)) ORDER BY DATEPART(YYYY, CAST(DatumZadosti AS DATE))) 
     FROM dbo.Smlouvy 
     GROUP BY 
      DATEPART(YYYY, CAST(DatumZadosti AS DATE)) 
      ,RANK()OVER(PARTITION BY DATEPART(YYYY, CAST(DatumZadosti AS DATE)) ORDER BY DATEPART(YYYY, CAST(DatumZadosti AS DATE))) 
    ) 
     SELECT * FROM resultset WHERE RN = 1 

任何帮助将aprreciated。谢谢。

+3

样本数据和预期结果请。 –

+0

你想在一年或一个月内获得最高的申请数量?你的解释是模糊的。一个例子会很长的路 –

+0

我已经清除编辑中的想法。 –

回答

2

窗口功能可帮助您:

SELECT TOP(1) 
    YearCount = COUNT(CisloSmlouvy) OVER (PARTITION BY DATEPART(YEAR, CAST(DatumZadosti AS DATE))) 
    ,MonthCount = COUNT(CisloSmlouvy) OVER (PARTITION BY DATEPART(YEAR, CAST(DatumZadosti AS DATE)), DATEPART(MONTH, CAST(DatumZadosti AS DATE))) 
    ,[Year]  = DATEPART(YEAR, CAST(DatumZadosti AS DATE)) 
    ,[Month] = DATEPART(MONTH, CAST(DatumZadosti AS DATE)) 
FROM dbo.Smlouvy 
ORDER BY YearCount DESC, MonthCount DESC 
0

这是不容易的,因为可能存在的联系。我建议分别选择最佳年份和最佳月份,并使用UNION ALL来合并两个结果:

select * 
from 
(
    (
    select top(1) with ties 
     year(DatumZadosti) as y, month(DatumZadosti) as m, count(*) as cnt 
    from mytable 
    group by year(DatumZadosti), month(DatumZadosti) 
    order by count(*) desc 
) 
    union all 
    (
    select top(1) with ties 
     year(DatumZadosti) as y, null as m, count(*) as cnt 
    from mytable 
    group by year(DatumZadosti) 
    order by count(*) desc 
) 
) unioned 
order by y desc, m desc;