Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何获取SQL Server中的运行总状态计数_Sql Server_Pivot - Fatal编程技术网

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对我有效。