2016-11-30 8 views
0

Ich habe eine Tabelle verwenden, die wie folgt aussieht:Auswahl des letzten Eintrags (Zeile) Datetime-Spalte

table_name | event_time   | row_count | num_of_times_observed 
test  | 2016-11-30 15:33:47 | 200  | 0 
test  | 2016-11-30 16:03:03 | 400  | 0 
test11  | 2016-11-30 15:33:34 | 300  | 0 
test11  | 2016-11-30 15:57:49 | 400  | 0 

Ich mag die Zeile finden, die den aktuellsten Wert in event_time einen Tabellennamen gegeben hat (oder allgemeiner, durch jeden eindeutigen Tabellennamen). Zum Beispiel, wenn wir die letzte Zeit für table_name ‚test11‘ zu finden sind, würden wir ein Ergebnis wie folgt erhalten:

table_name | event_time   | row_count | num_of_times_observed 
test11  | 2016-11-30 15:57:49 | 400  | 0 

Es gibt zwei Standards (Anfänger) Ansätze, die ich mich vorstellen kann zu erreichen dass:

SELECT table_name -- Approach#1 
    ,event_time 
    ,row_count 
    ,num_of_times_observed 
FROM my_table AS u 
WHERE table_name = 'test11' 
ORDER BY event_time DESC LIMIT 1 

Oder diese:

SELECT table_name -- Approach#2 
    ,event_time 
    ,row_count 
    ,num_of_times_observed 
FROM (
    SELECT * 
    FROM my_table 
    WHERE table_name = 'test11' 
    ) AS u -- I really don't need to filter by table_name here, but I hope it will improve the performance by just a little (especially if there are >100K rows for 'test11')? 
INNER JOIN (
    SELECT table_name 
     ,max(event_time) AS event_time 
    FROM my_table 
    GROUP BY table_name 
    HAVING table_name = 'test11' 
    ) AS q ON u.table_name = q.table_name 
    AND u.event_time = q.event_time 

Angenommen, es sind ca. 100 Millionen Zeilen in my_table, ich wie die oben genannten Ansätze fühlen sich nicht sehr effizient sein (opt imitiert). Ich habe StackOverflow nach möglichen Antworten durchforstet und Antworten wie this one gefunden, die fortgeschrittener sind. Ich frage mich, ob es bessere (effiziente) Möglichkeiten gibt, nach dem gewünschten Ergebnis zu fragen.

Vielen Dank für Ihre Antworten und Vorschläge!

+1

Bitte kennzeichnen Sie Ihre Frage mit der von Ihnen verwendeten Datenbank. –

+0

Sie möchten eine Liste des letzten Ereignisses aller Tabellen oder nur einer Tabelle? – McNets

+0

@GordonLinoff Danke. Markiert mit der DB, die ich verwende. :) – user1330974

Antwort

1

Ihr erster Ansatz ist der beste Ansatz.

Sie möchten einen Index für my_table(table_name, event_time). Bei einigen Datenbanken können Sie desc für die Spalte angeben, wenn Sie den Index erstellen.

1

können Sie auch für jede Tabelle

verwenden

select * from my_table 
where (table_name, event_time) in (select table_name, max(event_time) 
           from my_table 
            group by table_name) 

oder wenn Sie eine db verwenden, die nicht die Verwendung von Tupel allowd Sie ein
beitreten

select * from my_table t1 
INNER JOIN ( 
    select table_name, max(event_time) max_event 
    from my_table 
    group by table_name) t2 on t2.table_name = t1.table_name 
            and t2.max_event = t1.event_time 

verwenden können für absolut

select * from my_table as u 
where event_time in (select max(event_time) from my_table) 
+0

Die Abfrage für jede Tabelle gibt Syntaxfehler zurück. Ich denke 'where (table_name, event_time) in (select ...) ist in SQL nicht erlaubt. – user1330974

+0

welche db benutzen Sie? – scaisEdge

+1

Wie auch immer, ich habe update die Antwort für db, die schließlich nicht tuple .. – scaisEdge

Verwandte Themen