Цикл SQL Количество людей в программе за указанную продолжительность - PullRequest
0 голосов
/ 27 июня 2018

Я не уверен, должен ли быть цикл для этого или какой самый простой подход был бы.

Мои данные состоят из списка людей, участвующих в нашей программе. У них есть разные даты начала и окончания, но следующее уравнение может отразить количество людей, которые участвовали в определенную дату:

DECLARE @PopulationDate DATETIME = '2018-06-01 05:00:00';
select count(People) 
FROM Program_Log
WHERE 
START_TIME <= @PopulationDate
AND (END_TIME >= @PopulationDate OR END_TIME IS NULL)`

Есть ли способ, которым я могу зацикливаться на разных значениях даты, чтобы получать количество участников программы каждый день в течение всего года? Несколько лет?

1 Ответ

0 голосов
/ 27 июня 2018

Один простой способ - использовать CTE для генерации дат, а затем left join для ввода данных. Например, следующее получает число по состоянию на первое число месяца в этом году:

with dates as (
      select cast('2018-01-01' as date) as dte
      union all
      select dateadd(month, 1, dte)
      from dates
      where dte < getdate()
     )
select d.dte, count(pl.people)
from dates d left join
     program_log pl
     on pl.start_time <= d.dte and (pl.end_time >= d.dte or pl.end_time is null)
group by d.dte
order by d.dte;

Обратите внимание, что это будет работать лучше всего для нескольких дат. Если вам нужно больше 100, вам нужно добавить option (maxrecursion 0) в конец запроса.

Также, count(people) крайне подозрительно. Возможно, вы имеете в виду sum(people) или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...