Найдите месяцы в 2019 году, в которых было наибольшее и наименьшее число новых участников соответственно - PullRequest
0 голосов
/ 26 апреля 2019

Предположим, у меня есть таблица employee со столбцом DateOfJoining. И я ввел данные как

2019-12-4
2019-12-6
2019-12-5
2019-10-5
2010-08-17

Теперь я хочу написать SQL-запрос, чтобы найти месяц, в котором существует максимальное количество присоединяемых.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Использование Derived table и row_number()

В приведенном ниже запросе будет указан месяц, в котором существует максимальное количество присоединяемых к каждому году.

select cnt,mnth,yr
from
(select count(DateOfJoining)cnt,
        month(DateOfJoining)mnth,
        year(DateOfJoining)yr,
        row_number()over(partition by year(DateOfJoining) order by count(DateOfJoining)desc)srno
 from #employee
 group by month(DateOfJoining),year(DateOfJoining) 
)tbl
where srno = 1

output

cnt         mnth        yr
----------- ----------- -----------
1           8           2010
3           12          2019

и, если вы хотите специально для 2019, добавьте условие yr ='2019' в предложении where.

where srno = 1
and yr =2019

выход

cnt         mnth        yr
----------- ----------- -----------
3           12          2019
0 голосов
/ 26 апреля 2019

Вам нужны как самые большие, так и наименьшие - хотя я предполагаю, что вам нужен хотя бы один сотрудник.

with e as (
      select year(dateofjoining) as yyyy,
             month(dateofjoining) as mm,
             count(*) as totaljoining
      from employee
      where dateofjoining >= '2019-01-01' and
            dateofjoining < '2020-01-01'
      group by year(dateofjoining), month(dateofjoining)
     )
select e.*
from ((select top (1) e.*
       from e
       order by totaljoining asc
      ) union all
      (select top (1) e.*
       from e
       order by totaljoining desc
      ) 
     ) e;

Примечания:

  • При сравнении дат используются прямые сравненияна даты, а не с помощью функций.Это лучшая практика, поэтому оптимизатор может использовать индексы.
  • Требуется как наименьшее, так и наибольшее значение, поэтому здесь используется CTE, поэтому group by представляется только один раз.
  • Это будетне возвращайте месяцы без сотрудников.
  • Если вы хотите завязать галстуки, используйте top (1) with ties.
0 голосов
/ 26 апреля 2019

Вы можете попробовать ниже - используя агрегацию и ТОП

select top 1 month(dateofjoining),count(*) as totaljoining
from tablename
where year(dateofjoining)=2019
group by month(dateofjoining)
order by 2 desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...