在每段记录的一段时间内获得最小值

时间:2013-12-10 19:36:10

标签: sql sql-server-2008 group-by aggregation

我有一张表格,列出了每个日历月的部门和事件总数,如下所示。数据按部门和日期字段排序。

我要做的是获取每个公司过去3个月的“计数”字段的最小值,并在原始表格中显示每行

例如,第一条记录的Count = 2且在2011-1-1之前没有Dept-001的数据,因此min(Count)为2。 第二个记录的Count = 9,过去3个月的min(Count)是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

2 个答案:

答案 0 :(得分: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

上试用

答案 1 :(得分: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;