Выбрать только одну саму свежую строку для поля?

Есть таблица вида
"FLOW"	"OTPERIOD"	"LOG_DATE"	"LOG_TIME"	"ENTITY"	
"1000"	"2016.12"	"2017-08-31"	"17:12:18"		"1059"	
"1000"	"2016.12"	"2017-08-30"	"17:06:53"		"1059"	
"1000"	"2016.12"	"2017-08-30"	"17:05:58"		"1059"
"1000"	"2016.12"	"2017-09-17"	"13:11:39"		"2215"	
"1000"	"2016.12"	"2017-09-16"	"13:09:57"		"2215"	
"1000"	"2016.12"	"2017-09-16"	"12:03:26"		"2215"
"1000"	"2016.12"	"2017-08-23"	"19:17:18"		"8998"	
"1000"	"2016.12"	"2017-08-22"	"19:14:32"		"8998"	
"1000"	"2016.12"	"2017-08-22"	"17:00:08"		"8998"


Нужно оставить только самую свежую запись для каждого ENTITY - перенести в другую таблицу либо удалить остальные строки. То есть должно остаться в итоге только три строки. Можно ли такое реализовать одним запросом? Либо как это реализовать самым простым способом?
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
для MySQL 8.0 испльзовать row_number()

для более ранних версий использовать подзапросы:

-- For MySQL 8.0
select FLOW, OTPERIOD, LOG_DATE, LOG_TIME, ENTITY
  from (
    select
      FLOW, OTPERIOD, LOG_DATE, LOG_TIME, ENTITY,
      row_number() over (partition by ENTITY order by LOG_DATE desc, LOG_TIME desc) num
    from test
  ) tt
  where num = 1
;


-- For MySQL <=8.0
select t.*
  from test t
  inner join (
    select max(LOG_DATE) LOG_DATE, MAX(LOG_TIME) LOG_TIME, ENTITY
      from test
      group by ENTITY
      having concat(LOG_DATE,' ', LOG_TIME) = max(concat(LOG_DATE,' ', LOG_TIME))
) tt on tt.ENTITY = t.ENTITY and tt.LOG_DATE = t.LOG_DATE and tt.LOG_TIME = t.LOG_TIME
;


-- For MySQL <=8.0
select *
  from test t
  where concat(LOG_DATE,' ', LOG_TIME) = (
    select max(concat(LOG_DATE,' ', LOG_TIME))
      from test tt
        where tt.ENTITY = t.ENTITY
      group by ENTITY
  )
;


как-то так, см. пример на dbfiddle.uk

PS: но по последним двум вариантам будет выдаваться несколько записей если в одну секунду по одному и тому же ENTITY пишется несколько записей, надо дальше "колхозить".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы