2015-06-03 3 views
0

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

activity_id   int 
activity_client_id int 
activity_type_id int 
activity_start_date datetime 
activity_end_date datetime 

Одна запись для каждого экземпляра клиента, осуществляющего деятельность. Например, сегодня они могут иметь записи активности, которая имеет activity_start_date of '03 -JUN-2015 09:00:00' и activity_end_date of '03 -JUN-2015 11:30:00'

Так, используя эту таблицу , мы можем составить до скольких минут активности клиент выполнил, делая это:

select client_id, 
sum(DATEDIFF(MINUTE, activity_start_date , activity_end_date)) as total_minutes 
from activity 
group by client_id 

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

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

Однако мне интересно, могу ли я достичь результатов «на лету» с помощью запроса выбора вместо того, чтобы запускать хранимую процедуру?

Редактировать: В соответствии с просьбой я дам вам некоторые примеры данных, чтобы уточнить, чего я пытаюсь достичь. Ниже мы видим записи для client_id 112. Вопрос в том, на какой срок клиент выполнил 300 минут (5 часов) общей активности? Для этого клиента ответ будет 03/06/2015

+-------------+----------------------+---------------------+-------------------+ 
| activity_id | activity_client_id | activity_start_date | activity_end_date | 
+-------------+----------------------+---------------------+-------------------+ 
|  112434 |     112 | 01/06/2015 09:00 | 01/06/2015 11:00 | 
|  112490 |     112 | 02/06/2015 12:00 | 02/06/2015 16:00 | 
|  112688 |     112 | 03/06/2015 09:00 | 03/06/2015 16:00 | 
|  112998 |     112 | 04/06/2015 09:00 | 04/06/2015 10:00 | 
+-------------+----------------------+---------------------+-------------------+ 

Таким образом, используя оператор выбора, как бы мы работали это? Я могу решить, как это сделать в хранимой процедуре, используя цикл, но я бы предпочел просто иметь инструкцию select.

+0

Можете ли вы предоставить образцы данных и желаемые результаты, чтобы мы правильно поняли вопрос? –

+0

Я добавил примеры данных на мой вопрос сейчас. – Brian

+0

Какая у вас версия SQL Server? – dnoeth

ответ

1

Как об этом:

select client_id, 
sum(DATEDIFF(MINUTE, activity_start_date , activity_end_date)) as total_minutes 
from activity 
group by client_id 
having sum(DATEDIFF(MINUTE, activity_start_date , activity_end_date)) > 300 

Это даст вам всех клиентов, общая активность> 300 минут. Отправьте этот список в свою хранимую процедуру для обновления.

+0

Да - это хорошее начало сократить количество записей, которые мне нужно обработать. Но вопрос заключается не только в том, что клиенты выполнили 300 или более минут - на какой день каждый клиент завершил 300 минут активности? – Brian

1

Что вам нужно, это совокупная сумма. Лучше всего это сделать в SQL Server 2012+, но вы можете реализовать его (менее эффективно) в более ранних версиях:

select a.* 
from (select a.*, a2.cume_minutes, 
      (a2.cume_minutes - datediff(minute, a2.activity_start_date, 
             a2.activity_end_date) 
             ) as prev_cume_minutes 
     from activity a cross apply 
      (select sum(datediff(minute, a2.activity_start_date, a2.activity_end_date)) as cume_minutes 
      from activity a2 
      where c2.client_id = a.client_id and 
        a2.activity_start_date <= a.activity_start_date 
      ) a2 
    ) a 
where prev_cume_minutes < 300 and cum3_minutes >= 300; 

Это предполагает, что периоды активности не перекрываются, которые, как представляется, в случае базы на Пример данных.

+0

Спасибо за это - но, к сожалению, в моих фактических данных будет перекрытие. Я думаю, что мне не удастся написать хранимую процедуру. – Brian

+0

@Brian. , , Задайте еще один вопрос о перекрытии данных. Примеры данных и результатов действительно полезны (и я также предлагаю использовать YYYY-MM-DD для формата даты, это международный форум). –

+0

Спасибо @ Gordon, да, я вижу, что я более упростил свои данные, и я не был достаточно ясен о том, чего я пытаюсь достичь здесь. Я отправлю новый вопрос, спасибо за предложение кумулятивной суммы - это определенно дает мне в правильном направлении, я думаю. – Brian

Смежные вопросы