2017-07-19 47 views
0

在我的mysql數據庫中,我有一個表,可以調用狀態。該表具有creative_id,每次對廣告素材進行狀態更改時,我們會記錄一個新行,並將舊行更改爲is_current爲0,並將新行更改爲1.IN SQL檢查版本化行是否更新

我想查詢有多少人有過在狀態更改爲「已審覈」後狀態更改超過90天。所以下面的查詢就是從頭開始的,但問題是,如果在90天內發生了一些變化,但通過多次更改,最終結果會超過90天。這裏是我的查詢到目前爲止:

SELECT COUNT(*) FROM creative_status_version csv 
INNER JOIN creative_status_version csv2 
ON csv.creative_id = csv2.creative_id 
AND DATEDIFF(day, csv2.last_modified_time, csv.last_modified_time) > 90 
WHERE csv.audit_status = 'audited' 
AND csv.is_current = 0 
AND csv2.audit_status = 'rejected' 
AND csv2.is_current = 1 

例子:

|creative_id| audit_status| is_current| last_modified_time | 
|1   |audited  | 0   | 1-1-2017   | 
|1   |rejecected | 1   | 5-1-2017   | 
|2   |audited  | 0   | 1-1-2017   | 
|2   |pending  | 0   | 2-1-2017   | 
|2   |rejected  | 1   | 5-1-2017   | 
|3   |audited  | 1   | 1-1-2017   | 
|4   |rejected  | 1   | 5-1-2017   | 

因爲從審計去唯一的結果 - >別的...... 90天的時間跨度之後是創意與ID = 1,則結果將是:

|Count(*)| 
|1  | 
+0

我是sory,但我不明白你的問題。請提供一些示例數據,預期的輸出以及您的查詢提供的輸出。請選擇您的樣本數據來證明您正在描述的問題。 – Shadow

+0

所以基本上,你想要的是查詢已經或者已經超過90天的所有狀態改變。這在純SQL中會非常困難,如果它已經超過90天,我建議添加一個標誌並將其修改爲服務器端 –

+0

這是正確的Joshua,但是我沒有這個選項用於組織原因 –

回答

0

我遵循的邏輯是:

  1. 獲取所有審計記錄
  2. 爲同一廣告素材ID和審計記錄得到,其中狀態不審覈的最小日期和日期大於審覈日期
  3. 計數,如果時間差>90天

    Select count(*) from 
        (select csv.creative_id, csv.last_modified_time 
        FROM creative_status_version csv 
        INNER JOIN creative_status_version csv2 ON csv.creative_id = csv2.creative_id 
        WHERE csv.audit_status = 'audited' 
        AND csv2.audit_status <> 'audited' 
        AND csv2.last_modified_time>csv.last_modified_time 
        GROUP BY csv.creative_id, csv.last_modified_time 
        HAVING TIMESTAMPDIFF(day, csv.last_modified_time, min(csv2.last_modified_time)) > 90) t 
    

如果你能有一個以上的審計記錄percreative ID和你想只算最近他們與最早的非審計之間的差異,thenyou需要有到位的creative_status_version csv一個子查詢返回每個廣告素材ID的最大日期tatus被審計。