2016-12-27 4 views
0

Angesichts einer einfachen Tabelle, die eine Datums- oder Datetime-Spalte enthält, möchte ich die maximale Anzahl aufeinanderfolgender Tage abfragen, in denen Zeilen existieren, wenn optionale Filter vorhanden sind.Herausfinden einer maximalen Anzahl aufeinanderfolgender Tage

z.B. sagen eine Tabelle mit den folgenden Spalten:

id, Datumzeit, Benutzername, Kategorie

ich auf die effizienteste Art und Weise in der Lage sein möchten abfragen, möglich, die:

  • längste Streifen (in Tagen) eines gegebenen Benutzernamen,
  • längste Streifen (in Tagen) eines gegebenen Benutzernamen innerhalb einer gegebenen Kategorie,
  • längste Streifen (in Tagen) unabhängig von einem Benutzernamen oder Kategorie,
  • usw.

(Ich denke, die Abfrage nicht viel auf dieser Filter basieren würde sich ändern, aber sie geben eine Idee.)

Gefunden andere ähnliche Fragen, aber keine schien auf dieses besondere Bedürfnis zu antworten, aber fühle mich frei, mich mit einem geeigneten zu verbinden, den ich vielleicht verpasst habe.

Vielen Dank im Voraus.

+0

Möchten Sie die größte Anzahl aufeinanderfolgender Tage haben, die ein bestimmter Benutzer aufgezeichnet hat (schwer) oder die größte Anzahl von Tagen zwischen zwei aufeinander folgenden Anmeldungen (einfach)? – Faibbus

+0

Das ehemalige. Und mir ist klar, dass die Abfrage nicht einfach sein wird ... Danke. – Jeto

+0

Dies wird als eine LAG-Abfrage strukturiert, die den Unterschied zwischen diesen Zeilen Daten und der vorherigen Zeile berechnet. dann sollte das einen Wert von "1" erzeugen, wenn weniger als ein Tag. Diese ganze Sache ist eine Unterabfrage für eine kumulative Summe, die auf einer Nicht-1-Zeile zurückgesetzt wird. - Das ist die Unterabfrage für eine MAX-Aggregation. – Randy

Antwort

0

Also am Ende der Antwort war so ziemlich das gleiche wie die der bestehenden Frage: Checking for maximum length of consecutive days which satisfy specific condition.

Allerdings schrieb ich es für mehr Klarheit und justiert ein paar Dinge:

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; 

Kennzeichnung dieser Frage als Duplikat obwohl direkt am Ende scheint.

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; 

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

+0

Oh, das scheint die Antwort aus der ersten "verwandten" Frage zu sein, ich bin darauf gestoßen, aber aus irgendeinem Grund dachte ich, dass der Fall, den ich hatte, nicht genau derselbe war. Es scheint zu funktionieren, aber ich kann es nicht vor ein paar Stunden versuchen, danke trotzdem! – Jeto

+1

Ihr Fall war nicht genau derselbe, aber es hat sehr starke Ähnlichkeit. Lassen Sie mich wissen, wenn Sie einen Tippfehler finden, ich hatte nicht die Chance, es von hier aus zu testen. – Faibbus

+1

Eigentlich war die COUNT/GROUP BY der Abfrage notwendig, und ich habe noch ein paar Anpassungen vorgenommen. Ich poste es als Antwort selbst und markiere es als Duplikat. Vielen Dank für Ihre Hilfe. – Jeto

Verwandte Themen