查询以查找累积同时减去其他计数

Posted

技术标签:

【中文标题】查询以查找累积同时减去其他计数【英文标题】:Query to find Cumulative while subtracting other counts 【发布时间】:2014-09-21 05:00:45 【问题描述】:

这是我的表结构

Id     INT
RecId  INT
Dated  DATETIME
Status INT

这是我的数据。

状态表(包含不同的状态)

Id   Status
1    Created
2    Assigned

日志表(包含记录所经历的不同状态的日志 (RecId))

Id   RecId     Dated                              Status  

1     1       2013-12-09 14:16:31.930               1
2     7       2013-12-09 14:27:26.620               1
3     1       2013-12-09 14:27:26.620               2
3     8       2013-12-10 11:14:13.747               1
3     9       2013-12-10 11:14:13.747               1
3     8       2013-12-10 11:14:13.747               2

我需要从这些数据中生成以下格式的报告。

Dated                     Created                   Assigned
2013-12-09                 2                         1
2013-12-10                 3                         1

这里的行数据是按日期计算的。 Created 的计算方式为(上一个记录(日期)Created count - Previous date Assigned count)+ Todays Created count。

例如,如果在日期 2013 年 12 月 10 日创建了三个条目以记录表,其中两个具有已创建状态,而一个具有已分配状态。因此,在我要为报告构建的所需视图中,对于日期 2013-12-10,视图将返回 Created as 2 + 1 = 3 其中 2 是日志表中新插入的记录,1 是前一天剩余的记录数(创建 - 分配)2 - 1。

我希望情况很清楚。请询问我是否需要更多信息。

请帮我用sql来构造上面的视图。

【问题讨论】:

假设记录的顺序是“创建然后分配”是否正确?那么创建的记录日期会小于分配的日期吗? @Mike 的确切创建比分配的记录更早 【参考方案1】:

这符合所提供样本的预期结果,但可能需要更多测试。

with CTE as (
        select
                  *
                , row_number() over(order by dt ASC) as rn
        from (
              select
                      cast(created.dated as date) as dt
                    , count(created.status)       as Created
                    , count(Assigned.status)      as Assigned
                    , count(created.status) 
                      - count(Assigned.status)    as Delta
              from LogTable created
              left join LogTable assigned
                           on created.RecId = assigned.RecId
                          and created.status = 1
                          and assigned.Status = 2
                          and created.Dated <= assigned.Dated
              where created.status = 1
              group by
                      cast(created.dated as date)
          ) x
     )
select
    dt.dt
  , dt.created + coalesce(nxt.delta,0) as created
  , dt.assigned
from CTE dt
left join CTE nxt on dt.rn = nxt.rn+1
;

结果:

|         DT | CREATED | ASSIGNED |
|------------|---------|----------|
| 2013-12-09 |       2 |        1 |
| 2013-12-10 |       3 |        1 |

See this SQLFiddle demo

【讨论】:

谢谢,但这只会返回创建的计数,而不考虑分配了多少。例如,昨天创建了 5 个,其中分配了 2 个。今天创建了 3 个,所以今天创建的计数将是 (5-2)+3 = 6 您使用什么版本的 SQL Server? 答案已修改。请注意,通过提前和滞后函数使用 sql server 2012 会更简单。 @Used_By_Already, dt.dt = dateadd(day,1,nxt.dt) 为日期序列中的空白处的“上一个日期分配计数”给出 0。是对还是错?我将加入 CTE 在 CTE 中按日期排序的 rownum:sqlfiddle.com/#!3/3c6e1/23 在日期序列的空白处为“上一个日期分配的计数”提供 0:: 是的。问题是,如果您使用的设备少于或类似的设备,您需要的连接数比您想要或需要的多。可以使用 row_number() 来解决这个问题,但我现在没有时间这样做。

以上是关于查询以查找累积同时减去其他计数的主要内容,如果未能解决你的问题,请参考以下文章

Hive 查询以查找中间几周的计数

SQL查询以查找表中列值多次出现的计数?

过去 X 个月内的 PostgreSQL 累积计数

如何在 R 中获取表格,包括计数、相对频率和累积频率?

altair 的累积计数

SQL 累积不重复计数