2013-09-22 2 views
1

У меня есть некоторые данные для анализа, которые на полчаса зернистости, но хотели бы сгруппировать их на 2, 3, 6, 12 и 2 дня и 1 неделю, чтобы сделать еще несколько значимые сравнения.Sql Server 2012 - Групповые данные по разным временным интервалам

|DateTime | Value | 
|01 Jan 2013 00:00 | 1 | 
|01 Jan 2013 00:30 | 1 | 
|01 Jan 2013 01:00 | 1 | 
|01 Jan 2013 01:30 | 1 | 
|01 Jan 2013 02:00 | 2 | 
|01 Jan 2013 02:30 | 2 | 
|01 Jan 2013 03:00 | 2 | 
|01 Jan 2013 03:30 | 2 | 

Например. 2 часа сгруппированных результат будет

|DateTime | Value | 
|01 Jan 2013 00:00 | 4 | 
|01 Jan 2013 02:00 | 8 | 

Чтобы получить 2 ежечасно сгруппированных результат, я думал, что этот код -

CASE 
WHEN DatePart(HOUR,DateTime)%2 = 0 THEN 
    CAST(CAST(DatePart(HOUR,DateTime) AS varchar) + '':00'' AS TIME) 
ELSE 
    CAST(CAST(DATEPART(HOUR,DateTime) As Int) - 1 AS varchar) + '':00'' END Time   

Это, кажется, работает хорошо, но я не могу думать об использовании этого обобщить 3, 6, 12 часов. Я могу в течение 6, 12 часов просто использовать заявления о случаях и добиваться результата, но есть ли способ обобщить, чтобы я мог добиться детализации на уровне 2,3,6,12 часа, а также степени детализации на 2 дня и неделю? Обобщая, я имею в виду, что я мог бы передать переменную с желаемой детализацией в один и тот же запрос, вместо того, чтобы составлять разные запросы с разными аргументами case.

Возможно ли это? Укажите несколько указателей.

Большое спасибо!

+0

Благодаря zero323 для улучшения форматирования. Все еще найти мой путь через SO! – devSuper

+0

Итак, вы хотите, чтобы общий алгоритм разрезал ваши данные каждые X часов и построил кумулятивный (SUM) столбца «Значение»? – Neolisk

ответ

1

Я думаю, что вы можете использовать

Declare @Resolution int = 3 -- resolution in hours 

Select 
    DateAdd(Hour, 
     DateDiff(Hour, 0, datetime)/@Resolution * @Resolution, -- integer arithmetic 
     0) as bucket, 
    Sum(values) 
From 
    table 
Group By 
    DateAdd(Hour, 
     DateDiff(Hour, 0, datetime)/@Resolution * @Resolution, -- integer arithmetic 
     0) 
Order By 
    bucket 

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

Он пропустит ведра из, хотя, если у вас нет данных в них

Example Fiddle

+0

'/ @Resolution * @ Resolution'? Вам не хватает закрывающей скобки или чего-то еще? – Neolisk

+0

@Neolisk просто кодирует скрипку сейчас, но это не очевидно для меня, закрывающая скобка находится на следующей строке. – Laurence

+0

Ничего, я запутался в «целочисленной арифметике». Исходя из мира .NET, где в этом случае компилятор будет расширять преобразование. Просто проверено в SQL, да, эта часть будет работать нормально. – Neolisk

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