2012-06-25 5 views
1

В настоящее время я разрабатываю приложение, использующее базу данных SQL. В этой базе данных я поддерживаю таблицу под названием session, которая имеет три поля: идентификатор сеанса (int), date_created (datetimeoffset) и поле date_expired (datetimeoffset).SQL server datetimeoffset data aggregation

Я хочу сгруппировать сеансы в кластерах сеансов, чтобы минимальная дата_сшита и максимальная дата_сессии сеансов не превышали 6 часов. Кроме того, я не хочу, чтобы мои группы перекрывались, т. Е. Если сессия s1 принадлежит к группе 1, я не хочу, чтобы она также была в группе 2.

Любые идеи?

+1

Непонятные требования: хотите ли вы сгруппировать их по длительности или сгруппировать по дате начала, дате окончания, часам или таким образом, что если один запустился в 8:00 и завершился в 8:10, а другой начался в 9:00 и закончился 9:15, а другой начался в 2:01 вечера, первые два были бы «сгруппированы вместе, а 2:01 вечера - во второй группе (в тот же день для всех)? – xQbert

+0

Я хочу сгруппировать их по дате начала и дате окончания. Единственное ограничение должно состоять в том, что для двух сеансов в наборе их разность во времени (между датой начала и датой окончания) будет не более 6 часов. –

ответ

1

Я предлагаю вам создать 4 группы данных, как 0-6, 6-12, 12-18 и 18-24, так что вы можете сделать так:

FYI: для простоты, я сделал case только в столбце даты, вам нужно будет использовать датированный период между вашей date_created и date_expired.

FYI2: измените значения на промежутке между ними, как вам подходит, и в конце запрос вернет значения в 1, 2 , 3 и 4, которые вы должны изменить на «от 0 до 6», «от 6 до 12» и так далее.

with MyCTE as (
    select case 
      when datepart(hh,date) between 0 and 6 then 1 
      when datepart(hh,date) between 6 and 12 then 2 
      when datepart(hh,date) between 13 and 18 then 3 
      else 4 
      end 
      as myDatebucket 
    , * 
    from session 
) 
select myDatebucket, count(*) 
from MyCTE 
group by myDatebucket 
order by myDatebucket 
+0

Большое спасибо Диего –