Запрос MySQL — хотите показывать только уникальные записи

#mysql #sql

#mysql #sql

Вопрос:

У меня есть такая таблица

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

Я хочу показывать уникальные записи и принимать записи, которые имеют максимальное время, я написал этот запрос

 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
  

Я хочу пропустить столбец time и просто показать sensor_id, event_type и значение в конечном результате, какие-нибудь мысли?

Комментарии:

1. изменить b.* на B.sensor_ID, B.event_Type, B.Value

2. но тогда как насчет B.time = A.MaxDateTime?

3. это критика соединения. Я бы подумал, что вы захотите присоединиться к этому и sensor_Id и event_Type… время не будет отображаться, будет отображаться только то, что указано в выборе.

4. хорошо, позвольте мне попробовать.

5. но тогда как насчет B.time = A.MaxDateTime? Ничего. Проекция и выбор — это разные вещи.

Ответ №1:

  • измените B. * на нужные столбцы в ваших выходных данных…
  • упорядочивание подзапроса не имело смысла, поэтому я переместил его во внешний (обратите внимание, что вы все равно можете упорядочивать по столбцу, который не отображается!)
  • Я добавил критерии объединения, чтобы включить sensor и event_Type

.

 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
  

Ответ №2:

Если вам нужна одна строка за sensor_id максимальное время, тогда что-то вроде этого:

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

Редактировать:

Если вам нужно максимальное значение для каждого датчика и события, включите это в предложение correlation:

 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
               );
  

Комментарии:

1. Я думаю, вам понадобится дополнительная координация в подзапросе: e2.event_Type = E.Event_Type . кажется, они хотят максимум для каждого датчика и события.