我的示例是一個票務系統,保存狀態更新和創建票證的條目。
編輯:抱歉有不正確的小提琴鏈接
小提琴:https ://dbfiddle.uk/ ? rdbms = oracle_18 & fiddle = a5ff4600adbab185eb14b08586f1bd29
| ID | 票號 | 地位 | TICKET_CREATED | STATUS_CHANGED |
|---|---|---|---|---|
| 1 | 1 | 其他錯誤 | 01-JAN-20 | 01-JAN-20 08.00.00 |
| 2 | 2 | 技術錯誤 | 01-JAN-20 | 01-JAN-20 09.00.00 |
| 3 | 3 | 未知 | 01-JAN-20 | 01-JAN-20 09.10.00 |
| 4 | 4 | 未知 | 01-JAN-20 | 01-JAN-20 09.20.00 |
| 5 | 4 | 技術錯誤 | 01-JAN-20 | 02-JAN-20 09.30.00 |
| 6 | 1 | 解決了 | 01-JAN-20 | 02-JAN-20 10.00.00 |
| 7 | 2 | 解決了 | 01-JAN-20 | 02-JAN-20 07.00.00 |
| 8 | 5 | 技術錯誤 | 02-JAN-20 | 02-JAN-20 08.00.00 |
| 9 | 6 | 未知 | 02-JAN-20 | 02-JAN-20 08.30.00 |
| 10 | 6 | 解決了 | 02-JAN-20 | 02-JAN-20 09.30.00 |
| 11 | 5 | 解決了 | 02-JAN-20 | 03-JAN-20 08.00.00 |
| 12 | 4 | 未知 | 01-JAN-20 | 03-JAN-20 09.00.00 |
我想根據票證創建日期評估資料,并獲取特定日期的三件事:
- (完成)在給定日期總共創建了多少票證
- (完成)在給定日期以“未知”狀態創建了多少票證
- (未完成)在給定日期有多少票完全處于“未知”狀態?棘手!因為重要的是
STATUS_CHANGED給定日期午夜以下最大值的狀態。
2021 年 1 月 1 日的預期結果:
| TICKET_CREATED | 創建總數 | 以未知狀態創建的工單 | 處于未知狀態的票總數 |
|---|---|---|---|
| 01-JAN-20 | 4 | 2 | 2 |
說明:在 01-JAN-20,票 3 和 4 在一天結束時處于“未知”狀態
2021 年 1 月 2 日的預期結果:
| TICKET_CREATED | 創建總數 | 以未知狀態創建的工單 | 處于未知狀態的票總數 |
|---|---|---|---|
| 02-JAN-20 | 2 | 1 | 1 |
說明:在 02-JAN-20,當天結束時只有票 3 處于“未知”狀態
第 1 2 部分的當前解決方案:
select ticket_created,
count(*) as "Total Created",
sum(case when status = 'unknown' then 1 else 0 end) as "Unknown tickets created",
'?' as "Total tickets in Unknown status"
from myTable
where id in
(select min(id) as id
from myTable
where ticket_created = to_date('01.01.2020', 'DD.MM.YYYY')
group by ticketid)
group by ticket_created
你能給我一些關于如何處理第 3 點的提示嗎?
uj5u.com熱心網友回復:
假設我正確理解了您的邏輯,這就是我將如何實作您的目標:
with ticket_info as (select id,
ticketid,
status,
ticket_created,
status_changed,
row_number() over (partition by ticketid, trunc(status_changed) order by status_changed desc) rn_per_id_day_desc,
row_number() over (partition by ticketid order by status_changed) rn_per_id_asc
from mytable)
select ticket_created,
count(distinct case when trunc(ticket_created) = to_date('01/01/2020', 'dd/mm/yyyy') then ticketid end) as "Total Created",
count(case when rn_per_id_asc = 1 and status = 'unknown' then 1 end) as "Unknown tickets created",
count(case when rn_per_id_day_desc = 1 and status = 'unknown' then 1 end) as "Total tickets in Unknown status"
from ticket_info
where status_changed >= to_timestamp('01/01/2020', 'dd/mm/yyyy')
and status_changed < to_timestamp('01/01/2020', 'dd/mm/yyyy') interval '1' day
group by ticket_created;
資料庫<>小提琴
您可以看到,首先,我使用了幾個row_number()分析函式來為行提供標簽 - 一個按 id 按照更改順序標記行(這使我們能夠識別每個 id 的第一行,即創建的票證行),另一個以降序標記每個 id 和日期的行(這使我們能夠識別每個 id 當天的最后一行)。
使用該資訊,我們可以計算您的所有三個案例:
- 一天創建的票證 - 在這里我使用了不同的計數,但您可以將其更改為
count(case when rn_per_id_asc = 1 then 1 end),這可能更有效且更易于理解。 - 在“未知”的一天創建的票證 - 在這里我使用了條件計數:如果它是第一行并且狀態未知,則對其進行計數
- 在一天結束時處于“未知”狀態的門票 - 在這里我使用了另一個條件計數:如果它是當天的最后一行并且狀態未知,則對其進行計數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361895.html
