2013-12-10 5 views
1

У меня есть таблица, в которой перечислены департаменты и общее количество инцидентов за каждый календарный месяц, как показано ниже. Данные упорядочиваются по полям «Депт» и «Дата».Получение минимального значения за определенный период времени для каждой записи

Что я пытаюсь сделать, это получить минимальное значение поля «Count» за последние 3 месяца для каждой компании и отобразить его для каждой строки в исходной таблице.

Например, первая запись имеет счетчик = 2 и данные до 2011-1-1 отсутствуют для Dept-001, поэтому min (Count) равно 2. Вторая запись имеет Count = 9 и мин (граф) за последние 3 месяца составляет 2. и т. д.

Как бы вы напишете запрос, чтобы дать этот результат? Спасибо,

ТАБЛИЦА

Dept Count Date 
001 2  2011-1-1 
001 9  2011-2-1 
001 1  2011-3-1 
001 4  2011-4-1 
001 5  2011-5-1 
001 3  2011-6-1 
002 2  2011-1-1 
002 7  2011-2-1 
002 1  2011-3-1 
002 9  2011-4-1 
002 6  2011-5-1 
002 1  2011-6-1 

ВЫВОД

Dept Min(Last 3 Month) Date 
001 2     2011-1-1 
001 2     2011-2-1 
001 1     2011-3-1 
001 1     2011-4-1 
001 1     2011-5-1 
001 3     2011-6-1 
002 2     2011-1-1 
002 2     2011-2-1 
002 1     2011-3-1 
002 1     2011-4-1 
002 1     2011-5-1 
002 1     2011-6-1 
+0

Помогает ли это? http://stackoverflow.com/questions/5662545/how-do-i-group-on-continuous-ranges –

ответ

2

Вы должны автообъединение таблицу с периодом:

SELECT t1.dept, MIN(t2.cnt) min_last_3_month, t1.dat FROM 
    tbl t1 
INNER JOIN tbl t2 ON t1.dept = t2.dept 
       AND t2.dat > DATEADD(MONTH, -3, t1.dat) 
       AND t2.dat <= t1.dat 
GROUP BY 
    t1.dept, t1.dat 
ORDER BY 
    t1.dept, t1.dat 

вы можете попробовать его на SQLFiddle

0
SELECT x.[Dept], x.[Date], x.[Count], 
     (
      SELECT MIN(y.[Count]) FROM dbo.MyTable y 
      WHERE y.[Dept] = x.[Dept] 
      AND  y.[Date] BETWEEN DATEADD(DAY, 1, DATEADD(MONTH, -3, x.[Date])) AND x.[Date] -- Assumption: [Date]'s type is DATE 
     ) AS MIN_Count 
FROM dbo.MyTable x; 
Смежные вопросы