Cara menjalankan jumlah status total di SQL Server

Saya memiliki tabel yang menyimpan riwayat status tugas. Status tugas dapat berubah seiring waktu dan setiap kali status tugas berubah, entri baru dibuat dalam tabel dengan status baru dan tanggal diubah.

Contoh:

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

Bagaimana cara saya menanyakan jumlah status "total berjalan" seperti di bawah ini?

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

Misalnya, pada 07-03-2018:

  • status Tugas 100 adalah READY (Terakhir diperbarui menjadi READY pada 04-03-2018)
  • status Tugas 101 SELESAI (Terakhir diupdate menjadi SELESAI pada 05-03-2018)
  • status Tugas 102 SELESAI (Terakhir diupdate menjadi SELESAI pada 07-03-2018)

Jadi status yang dihitung pada 07-03-2018 adalah READY:1, RUNNING:0, FINISHED:2

Saya menemukan beberapa contoh total yang berjalan di web yang menggunakan partisi, tetapi sepertinya saya tidak dapat menerapkannya pada skenario ini.


person k.t    schedule 10.06.2018    source sumber
comment
Total berjalan biasanya dihitung sehubungan dengan tanggal menaik. Seiring bertambahnya tanggal, nilai bidang dijumlahkan untuk menghitung jumlah semua catatan hingga hingga tanggal saat ini. Data sampel Anda sepertinya tidak menunjukkan hal serupa dengan ini.   -  person Giorgos Betsos    schedule 10.06.2018
comment
Ini bukan total berjalan. Tapi idenya serupa. Pada setiap tanggal, saya perlu menghitung berapa banyak tugas di setiap negara bagian. Karena status setiap tugas mungkin tidak berubah setiap hari, kita perlu mencari pembaruan status tugas hingga hingga tanggal saat ini (dalam urutan menaik), untuk mendapatkan jumlah status pada tanggal tersebut.   -  person k.t    schedule 10.06.2018
comment
Bisakah Anda menjelaskan bagaimana penghitungan setiap status dihitung untuk tanggal tertentu, misalnya. 2018-03-07? Selain itu, mengapa data sampel Anda dicantumkan dalam urutan menurun?   -  person Giorgos Betsos    schedule 10.06.2018
comment
Ah, saya kira urutan naik dalam contoh akan lebih baik. Tapi itu tidak benar-benar mengubah apa pun. Pada 07-03-2018: - status Tugas 100 adalah READY (Terakhir diperbarui menjadi READY pada 04-03-2018) - status Tugas 101 adalah FINISHED (Terakhir diperbarui menjadi FINISHED pada 05-03-2018) - status Tugas 102 adalah FINISHED (Terakhir diperbarui menjadi FINISHED pada 07-03-2018) Jadi status yang dihitung pada 07-03-2018 adalah READY:1, RUNNING:0, FINISHED:2   -  person k.t    schedule 10.06.2018
comment
Pertama cari tahu RDBMS mana yang Anda gunakan   -  person Strawberry    schedule 10.06.2018


Jawaban (1)


Daripada harus total, perlu hitungan status terbaru tiap ID?

Sesuatu seperti ini seharusnya berfungsi, tetapi Anda memerlukan tabel kalender (yang asli atau penghitungan):

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

Ini mengumpulkan status terbaru untuk masing-masing ID setiap hari dan kemudian menghitung jumlahnya. Mungkin ada kesalahan sintaksis, tetapi hal seperti ini seharusnya berhasil.

person Veijo    schedule 10.06.2018
comment
Bekerja untuk saya. Demo SQL - person k.t; 10.06.2018