Sql server 如何获取SQL Server中的运行总状态计数
我有一个保存任务状态历史记录的表。任务的状态可能会随时间而改变,每次任务状态改变时,都会在表中创建一个新条目,其中包含新状态和修改日期 例如:Sql server 如何获取SQL Server中的运行总状态计数,sql-server,pivot,Sql Server,Pivot,我有一个保存任务状态历史记录的表。任务的状态可能会随时间而改变,每次任务状态改变时,都会在表中创建一个新条目,其中包含新状态和修改日期 例如: Task ID| Status | Date Modified -------+--------+--------------- 100 |READY | 2018-03-01 101 |READY | 2018-03-01 102 |READY | 2018-03-01 100 |RUNNING | 2018-03-
Task ID| Status | Date Modified
-------+--------+---------------
100 |READY | 2018-03-01
101 |READY | 2018-03-01
102 |READY | 2018-03-01
100 |RUNNING | 2018-03-02
101 |RUNNING | 2018-03-03
100 |FINISHED| 2018-03-03
102 |RUNNING | 2018-03-04
100 |READY | 2018-03-04
101 |FINISHED| 2018-03-05
102 |FINISHED| 2018-03-07
我如何查询如下状态计数的运行总数
Date | READY | RUNNING | FINISHED
------------+-------+---------+----------
2018-03-01 | 3 | 0 | 0
2018-03-02 | 2 | 1 | 0
2018-03-03 | 1 | 1 | 1
2018-03-04 | 1 | 2 | 0
2018-03-05 | 1 | 1 | 1
2018-03-06 | 1 | 1 | 1
2018-03-07 | 1 | 0 | 2
例如,2018年3月7日:
任务100的状态最后一次更新为2018-03-04
任务101的状态最后更新为2018-03-05完成
任务102的状态最后更新为2018-03-07完成
因此2018-03-07的状态计数为就绪:1,运行:0,完成:2
我在web上遇到了几个使用分区覆盖的运行total示例,但我似乎无法将它们应用于此场景。您需要每个ID的最新状态计数,而不是运行total 像这样的东西应该有用,但你需要一个日历表,一个真实的日历表或一个理货表:
select
c.date,
sum(case when X.status = 'Ready' then 1 else 0 end),
sum(case when X.status = 'Running' then 1 else 0 end),
sum(case when X.status = 'Finished' then 1 else 0 end)
from
calendar c
outer apply (
select ID, Status from
(
select
ID,
row_number() over (partition by ID order by DateModified desc) RN
from
yourtable t
where
t.DateModified <= c.date
) X
where X.RN = 1
) X
group by
c.date
这将收集每天每个ID的最新状态,然后计算计数。可能存在语法错误,但类似的方法应该可以工作。通常根据升序日期计算运行总数。随着日期的增加,一个字段的值相加,以计算截至当前日期的所有记录的总和。您的示例数据似乎没有显示与此类似的内容。它不完全是一个运行总数。但想法是相似的。在每个日期,我需要计算每个州有多少任务。由于每个任务的状态可能不会每天更改,我们需要按升序查找截至当前日期的任务状态更新,以获取该日期的状态计数。您能否解释如何计算特定日期(例如2018-03-07)的每个状态计数?还有,为什么您的示例数据是按降序排列的?啊,我想在示例中按升序排列会更好。但这并没有改变什么。2018-03-07:-任务100的状态最后更新为2018-03-04的就绪状态-任务101的状态最后更新为2018-03-05的完成状态-任务102的状态最后更新为2018-03-07的完成状态,因此2018-03-07的状态计数为就绪:1,运行:0,完成:2首先找出您使用的RDBMS对我有效。