Подсчет строк в каждой группе при выполнении условия Sql Сервер - PullRequest
2 голосов
/ 11 апреля 2020

У меня есть таблица, которая выглядит следующим образом:

         ID            Date     IsFull
         1          2020-01-05    0 
         1          2020-02-05    0  
         1          2020-02-25    1  
         1          2020-03-01    1
         1          2020-03-20    1

Я хочу показать, сколько месяцев для ID = 1

имеют сумму (isfull) / count (*)>. 6 в данном месяце (более 60% раз в этом месяце isfull = 1)

Таким образом, окончательный результат должен

 ID     HowManyMonths
  1       1     --------(Only month 3----2 out 2 cases)

Если вопрос меняется на сумму (isfull) / count (*)> .4

тогда конечный результат должен быть

  ID     HowManyMonths
   1       2     --------(Month 2 and Month 3)

Спасибо !!

1 Ответ

2 голосов
/ 11 апреля 2020

Это можно сделать с двумя уровнями агрегирования:

select id, count(*) howManyMonths
from (
    select id
    from mytable
    group by id, year(date), month(date)
    having avg(1.0 * isFull) > 0.6
) t
group by id

Подзапрос агрегирует по идентификатору, году и месяцу и использует предложение having для фильтрации по группам, которые соответствуют уровню успеха (avg() пригодится для этого). Внешний запрос подсчитывает, сколько месяцев прошел целевой показатель для каждого идентификатора.

...