2016-07-31 14 views
2

Ich möchte in MySQL die Zeilen der letzten drei Tage für jeden Kunden anhand ihrer maximalen Zeitstempel auswählen, bin mir aber nicht sicher, wie dies zu tun ist.mysql Wählen Sie Zeilen der letzten 3 Tage für jeden Kunden

Beispieltabelle

id  | timestamp   | cust_ID 
899900 | 2016-04-09 12:00:00 | 500219 
899901 | 2016-04-12 16:00:00 | 500219 
899902 | 2016-04-14 11:00:00 | 500219 
899903 | 2016-04-15 12:00:00 | 500219 
909901 | 2016-04-08 16:00:00 | 500230 
909902 | 2016-04-14 11:00:00 | 500230 
909903 | 2016-04-15 12:00:00 | 500230 
939905 | 2016-05-02 19:00:00 | 500240 

Bisher habe ich folgendes:

SELECT * 
FROM table 
WHERE timestamp BETWEEN max(timestamp) AND (max(timestamp) - INTERVAL 3 DAY) 
GROUP BY cust_ID 

Aber es gibt den Fehler:

1111 'invalid use of group function'

+1

Übrigens ist 2 in sql Land nicht "zwischen" 3 und 1. – Strawberry

Antwort

1

Join um die Tabelle zu einer Ansammlung von selbst, dass für jeden Kunden des maximalen Zeitstempel findet:

SELECT t.* 
FROM mytable t 
JOIN (SELECT cust_ID, MAX(timestamp) max_timestamp -- each cust_ID's max timestamp 
     FROM mytable 
     GROUP BY cust_ID) m 
    ON timestamp BETWEEN max_timestamp - INTERVAL 3 DAY AND max_timestamp 
    AND t.cust_ID = m.cust_ID   -- join on the specific cust_ID's max timestamp 

Beachten Sie auch, dass Sie den kleineren Ausdruck erste in einem BETWEEN, also müssen

WHERE myColumn BETWEEN smaller AND larger 

Wenn Sie es anders kodieren um:

WHERE myColumn BETWEEN larger AND smaller -- don't do this 

Es wird immer noch kompilieren und ausführen, aber Sie werden keine Zeilen zurückgeben.

+0

Funktioniert perfekt, danke! –

0

Ich hoffe, richtig zu verstehen, was Sie suchen, für, aber könnte Sie benötigen für Aggregatfunktion und nicht wo

haben
SELECT cust_id, max(timestamp) 
from table 
GROUP BY cust_ID 
having max(timestamp) BETWEEN date_sub((max(timestamp) , INTERVAL 3 DAY) AND max(timestamp) ; 
+1

Wie auch immer, das ist immer noch falsch. – Strawberry

+0

Falsches Semikolon entfernt .. auf jeden Fall – scaisEdge

+0

Nein. Es ist konzeptionell falsch. Es wird nicht funktionieren. Sie können nicht den Zeitstempel "HABEN". Es ist nicht in der SELECT – Strawberry