我想獲得處于失敗狀態的最新作業行,但同一作業的前一行應該是成功的。我不想獲得不斷失敗的作業記錄。我正在使用 MySQL 5.6.10 版
源表job_status:
Job_name start_date end_date status
A 8/3/2022 12 PM 8/3/2022 1.30 PM failed
B 8/3/2022 12 PM 8/3/2022 1.00 PM failed
C 8/3/2022 3 PM 8/3/2022 3.10 PM success
B 8/3/2022 3 PM 8/3/2022 3.30 PM failed
C 8/3/2022 3 PM 8/3/2022 3.20 PM success
A 8/3/2022 2 PM 8/3/2022 2.10 PM success
A 8/3/2022 3 PM 8/3/2022 3.20 PM failed
期望的輸出:
Job_name start_date end_date status
A 8/3/2022 3 PM 8/3/2022 3.20 PM failed
我正在使用以下查詢,不確定如何檢查以前的運行。
select distinct(*)
from job_status
where status = 'failed'
order by start_date desc
uj5u.com熱心網友回復:
就性能而言,這不會贏得任何獎牌,但是......
select *
from t
where status = 'failed'
and coalesce((
-- previous status
-- coalesce is needed when there is no previous row
select status
from t as x
where x.job_name = t.job_name and x.start_date < t.start_date
order by x.start_date desc
limit 1
), 'success') = 'success'
and not exists (
-- no next record exists
select 1
from t as x
where x.job_name = t.job_name and x.start_date > t.start_date
)
uj5u.com熱心網友回復:
該問題的任何解決方案都將取決于一些非常重要的假設,這些假設應該在問題中得到解決:
- 國家只能從失敗走向成功
- “最新”是指最大 end_date 的行
- end_date 屬性是 DATETIME 型別
- end_date、job_status 和 job_name 的組合是唯一的
如果其中任何一個都不是,那么 SQL 中的解決方案是不可能的(在沒有其他資訊的情況下,使用程序語言仍然非常困難)。
同樣,這不是一個有效的函式,盡管它會受益于上面 4 中描述的組合的索引的存在,順序為 job_status、job_name、end_date(否則對于索引來說這將是一個糟糕的選擇)...。
SELECT c.*
FROM (
SELECT a.job_name, MAX(b.end_date) AS last_fail
FROM job_status a
JOIN job_status b
ON a.job_name=b.job_name
WHERE a.status='success'
AND b.status='failed'
GROUP BY a.job_name
) ilv
JOIN job_status c
ON ilv.job_name=c.job_name
AND ilv.last_fail=c.end_date
實際上,它只是分組最大問題的一個變體,仍然每周在這里被問一次,并且在手冊中有自己的章節。
根據資料的分布和行數,更有效的解決方案可能是讀取表中的每一行,按 job_name、job_status(降序)和 end_date 排序,然后在每次“成功”后立即回傳條目,其中job_name 與前一行匹配。這應該是可能的......
SELECT job_name, job_status, start_date, end_date
FROM (
SELECT @prev_status AS prev_status, @prev_job_name AS prev_job_name,
a.*,
@prev_status:=a.status AS currstatus,
@prev_job_name:=a.job_name AS currjobname
FROM (
SELECT b.*
FROM job_status b
ORDER BY b.job_name, b.status DESC, d.end_date DESC
) a
) c
WHERE c.prev_status-'success'
AND c.job_status='failed'
AND c.prev_job_name=job_name
uj5u.com熱心網友回復:
未經測驗,但您應該能夠使用單個相關的存在子句來表達這一點:
select *
from job_status s
where s.status='failed'
and exists (
select * from job_status s2
where s2.job_name = s.job_name
and s2.status = 'success'
and s2.end_date < s.end_date
order by s2.end_date desc
limit 1)
order by start_date desc;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442411.html
上一篇:禁用特定時間的按鈕
