2016-12-27 107 views
0

給定一個包含日期或日期時間列的簡單表格,我想查詢在給定可選過濾器的情況下存在行的連續天數的最大連續條數。確定連續天數的最大連續數(0123)

例如說表有以下幾列:

ID,日期時間,用戶名,類別

我希望能夠查詢,以最有效的方式,將:

  • 最長的條紋(天)一個給定的用戶名,
  • 最長給定類別內的給定的用戶名的條紋(以天計),
  • 最長的條紋(天)無論任何用戶名或類別,

(我猜的查詢將沒有太大變化基於這些過濾器,但他們給的想法。)

找到其他類似的問題,但沒有似乎回答了這個特殊的需求,但是隨時可以將我聯繫到我可能錯過的適當的一個。

非常感謝您提前。

+0

您是否想要記錄一個給定用戶連續記錄天數的最大值(難度)或兩次連續登錄(簡單)之間的最大天數?前者爲 – Faibbus

+0

。我確實意識到查詢不會很簡單...謝謝。 – Jeto

+0

這將被構造爲一個LAG查詢,用於計算這些行數據與上一行之間的差異。那麼如果少於一天,那麼應該產生'1'的值。整個事件是在非1行上重置的累計和的子查詢。 - 那麼這就是MAX聚合的子查詢。 – Randy

回答

0

所以最終答案是幾乎相同的現有問題:Checking for maximum length of consecutive days which satisfy specific condition

但是我重寫了它更加清晰和調整的幾件事情:

SELECT streak 
FROM (
    SELECT IF(@prevDate + INTERVAL 1 DAY = current.date, @currentStreak := @currentStreak + 1, @currentStreak := 1) AS streak, @prevDate := current.date 
    FROM (
     SELECT DATE(datetime) AS date 
     FROM mytable 
     GROUP BY date 
     ORDER BY date 
    ) AS current 
    INNER JOIN (SELECT @prevDate := NULL, @currentStreak := 1) AS vars 
) AS _ 
ORDER BY streak DESC LIMIT 1; 

爲重複似乎是正確的,最終雖然標記這個問題。

1
SELECT streak 
FROM (
    SELECT tb.*, IF(@prev + INTERVAL 1 DAY = tb.d, @count := @count + 1, @count := 1) AS streak, @prev := tb.d 
    FROM (
     SELECT datetime AS d 
     FROM sometable 
     WHERE username = "PWET" 
     ORDER BY datetime 
    ) AS tb 
    INNER JOIN (SELECT @prev := NULL, @count := 1) AS vars 
) AS tb 
ORDER BY streak DESC LIMIT 1; 

來源:Checking for maximum length of consecutive days which satisfy specific condition

+0

哦,這似乎是第一個「相關」問題的答案,我碰到它,但由於某種原因,我認爲我的情況並不完全一樣。它似乎工作,但我不能在幾個小時之前嘗試,但謝謝你! – Jeto

+1

你的情況並不完全一樣,但它有很強的相似之處。如果您發現任何錯字,請告訴我,我沒有機會從這裏進行測試。 – Faibbus

+1

實際上,查詢的COUNT/GROUP BY是必要的,我又做了一些調整。我會張貼它作爲回答自己,並將其標記爲重複。非常感謝您的幫助。 – Jeto