查询以查找累积同时减去其他计数
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() 来解决这个问题,但我现在没有时间这样做。以上是关于查询以查找累积同时减去其他计数的主要内容,如果未能解决你的问题,请参考以下文章