【问题标题】:Getting min value over a period of time for each record在一段时间内为每条记录获取最小值
【发布时间】:2013-12-11 06:03:33
【问题描述】:

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

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

例如,第一条记录的 Count=2,并且 Dept-001 没有 2011-1-1 之前的数据,因此 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

【问题讨论】:

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


【解决方案1】:

您需要自行加入带有句点的表:

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

【讨论】:

    【解决方案2】:
    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;
    

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2010-11-06
      • 2016-07-27
      • 2017-02-19
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多