2016-10-04 4 views
0

Ich mag diesesMySQL-Abfrage - eindeutige Einträge nur

create table events 
(
    sensor_id integer not null, 
    event_type integer not null, 
    value integer not null, 
    time timestamp unique not null 
); 

Was ich will, eindeutige Einträge eine Tabelle zeigen, wollen zeigen, und die Einträge übernehmen, die maximale Zeit hat, habe ich diese Abfrage

geschrieben
SELECT B.* 
FROM events AS B 
RIGHT JOIN (SELECT DISTINCT sensor_id, event_type, MAX(time) AS MaxDateTime 
      FROM events 
      GROUP BY sensor_id, event_type 
      ORDER BY MAxDateTime DESC) A ON B.time = A.MaxDateTime 

Was ich möchte ist die Zeit Spalte überspringen und zeigen nur sensor_id, event_type und Wert im Endergebnis, irgendwelche Gedanken?

+4

Änderung 'b. *' Auf 'B.sensor_ID, B.event_Type, B.Value' – xQbert

+0

aber was ist dann mit B.time = A.MaxDateTime? – mohsinali1317

+1

das ist die Join-Kritik. Ich würde denken, dass Sie beitreten würde und sensor_Id und event_Type ... die Zeit wird nicht angezeigt werden, nur was in der Auswahl ist. – xQbert

Antwort

1
  • Änderung B. * auf die gewünschten Spalten in der Ausgabe ...
  • die Unterabfrage der Bestellung haben ‚nicht sinnvoll, so zog ich es an der äußeren (Hinweis: Sie können nach wie vor durch eine Spaltenreihenfolge, die nicht angezeigt wird!)
  • I hinzugefügt Kriterien beitreten Sensor und EVENT_TYPE enthalten

.

SELECT B.sensor_ID, B.event_Type, B.Value 
FROM events AS B 
RIGHT JOIN (SELECT distinct sensor_id, event_type, max(time) AS MaxDateTime 
      FROM events 
      GROUP BY sensor_id, event_type) A 
    on B.time = A.MaxDateTime 
and B.Sensor_ID = A.Sensor_ID 
and B.Event_Type = A.Event_Type 
ORDER BY B.Time 
1

Wenn Sie eine Zeile wollen pro sensor_id mit der maximalen Zeit, dann etwa so aus:

select e.* 
from events e 
where e.time = (select max(e2.time) 
       from events e2 
       where e2.sensor_id = e.sensor_id 
       ); 

EDIT:

Wenn Sie den max pro Sensor und Ereignis wollen, sind dann, dass in der Korrelation Klausel:

select e.* 
from events e 
where e.time = (select max(e2.time) 
       from events e2 
       where e2.sensor_id = e.sensor_id and 
         e2.event_type = e.event_type 
       ); 
+0

Ich denke, dass Sie zusätzliche Coorlation auf dem Subquyer benötigen würden: 'e2.event_Type = E.Event_Type'. es scheint, sie wollen max pro sensor und ereignis. – xQbert

Verwandte Themen