Comment find les valeurs les plus élevées dans les groupes?

J'ai une table avec un certain nombre de requests et une date. Je dois sélectionner l'année avec le plus grand nombre d'applications et un mois. Ma table ressemble à quelque chose comme:

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 

Je veux:

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

J'ai essayé

 ;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 

Toute aide serait appréciée. Merci.

Les fonctions de la window devraient vous aider:

 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 

Ce n'est pas facile, car il peut y avoir des liens. Je suggère de sélectionner les meilleures années et les meilleurs mois séparément et utiliser UNION ALL pour combiner les deux résultats:

 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;