Как получить общее количество статусов в SQL Server - PullRequest
0 голосов
/ 10 июня 2018

У меня есть таблица, в которой хранится история статусов задач.Статус задачи может меняться со временем, и каждый раз, когда статус задачи изменяется, в таблице создается новая запись с новым статусом и измененной датой.

Пример:

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-03-07:

  • статус задачи 100 ГОТОВ (Последнее обновление до ГОТОВ на 2018-03-04)
  • статус задачи 101 ЗАКОНЧЕН (последний обновлен до ЗАВЕРШЕН 2018-03-05)
  • состояние задачи 102 ЗАВЕРШЕНО (Последнее обновление до ЗАВЕРШЕНО в 2018-03-07)

Таким образом, значения состояния на 2018-03-07 ГОТОВЫ: 1, RUNNING: 0, FINISHED: 2

В Интернете я натолкнулся на несколько примеров общего количества, в которых используется разделение, но я не могу применить их к этому сценарию.

1 Ответ

0 голосов
/ 10 июня 2018

Вместо промежуточного итога, вам нужен счетчик последнего статуса для каждого ID?

Что-то вроде этого должно работать, но вам нужна таблица календаря (реальная или счетная):

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

Он собирает последний статус для каждого из идентификаторов для каждого дня, а затем вычисляет количество.Там могут быть синтаксические ошибки, но что-то вроде этого должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...