2017-07-11 8 views
-1

Ich habe eine Tabelle mit der folgenden Struktur:Wie lade ich den letzten Datensatz für jeden Tag in einer bestimmten Gruppe von Datensätzen?

id | service_name | subscribers_count | date 
1 | service 1 | 1     | 2017-07-01 01:01:01 
2 | Service 1 | 2     | 2017-07-01 01:01:02 
3 | Service 1 | 3     | 2017-07-02 01:01:01 
4 | Service 1 | 2     | 2017-07-03 01:01:01 
5 | Service 1 | 3     | 2017-07-04 01:01:01 
6 | Service 2 | 1     | 2017-07-01 01:01:01 
7 | Service 2 | 2     | 2017-07-01 01:01:02 
8 | Service 2 | 3     | 2017-07-01 01:01:03 
9 | Service 2 | 4     | 2017-07-02 01:01:01 

Es ist einfach den letzten Datensatz für jeden Dienst zu holen, aber ich brauche mehr - ich brauche den letzten Datensatz für jeden Dienst für jeden Tag zu holen. Dies ist, was ich erwarte zu erhalten:

2 | Service 1 | 2     | 2017-07-01 01:01:02 
3 | Service 1 | 3     | 2017-07-02 01:01:01 
4 | Service 1 | 2     | 2017-07-03 01:01:01 
5 | Service 1 | 3     | 2017-07-04 01:01:01 
8 | Service 2 | 3     | 2017-07-01 01:01:03 
9 | Service 2 | 4     | 2017-07-02 01:01:01 

Was ist der effektivste Weg, um es zu schreiben?

+0

Zeigen Sie uns die einfache Teil – Strawberry

+0

@Strawberry hier sind Sie https://stackoverflow.com/questions/10999522/how-to-get-the-latest-record-in-each-group-using-group-by – CorrieSparrow

+0

Ich kann nicht sehen, wie der "harte" Teil ist schwieriger als der "einfache" Teil ;-) – Strawberry

Antwort

1

Eine Methode ist eine korrelierte Unterabfrage in der where Klausel:

select t.* 
from t 
where t.date = (select max(t2.date) 
       from t t2 
       where t2.service_name = t.service_name and 
         date(t2.date) = date(t.date) 
       ); 
+0

(service_name) - obwohl ich zustimme, sollte es eine ID sein – Strawberry

0

Um Ihre eigene Lösung zu verwenden ...

SELECT t1.* 
    FROM messages t1 
    JOIN 
    (SELECT from_id 
      , SOMETHING HERE 
      , MAX(timestamp) timestamp 
     FROM messages 
     GROUP 
      BY from_id 
      , SOMETHING HERE 
    ) t2 
    ON t1.from_id = t2.from_id 
    AND SOMETHING HERE 
    AND t1.timestamp = t2.timestamp; 

Diese Lösung ist extrem 'wirksam'. Obwohl Sie nur einen Unterschied zwischen dieser Lösung und Gordon's bei einem ziemlich großen Datenbestand schätzen würden, vermute ich, dass diese Lösung diese Leistung übertreffen wird - obwohl ich erfreut wäre, dass sie sich als falsch erwiesen hat.

Verwandte Themen