Как вы получаете 1 запись на группу в MySQL, когда совпадают даты? - PullRequest
0 голосов
/ 21 апреля 2020

Насколько я могу судить, это не дубликат, так как у всех других есть РАЗНЫЕ даты. Например, у меня есть следующая таблица обслуживаемой компании, счетчика и последней даты:

Company    MeterCode  Name  LastDate
A          1          MeA   1/1/20
A          2          MeB   1/1/20
A          3          MeC   1/2/20
A          4          MeD   1/2/20

B          1          MeE   2/1/20
B          2          MeF   2/1/20
B          3          MeG   2/2/20
B          4          MeH   2/2/20

Как запросить эту таблицу, чтобы получить по 1 строке на компанию, возвращающую все столбцы, но с самой последней датой? У нескольких счетчиков может быть одна и та же последняя дата обслуживания, как вы видите, но мне все равно, какой счетчик я получу, если это самая последняя дата. В приведенном выше примере я бы хотел получить что-то вроде:

Company    MeterCode  Name  LastDate
A          4          MeD   1/2/20
B          4          MeH   2/2/20

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Для MySql версий до 8.0+ вы можете использовать коррелированный подзапрос в предложении WHERE:

select t.* from tablename t
where t.metercode = (
  select metercode from tablename
  where company = t.company
  order by lastdate desc, metercode desc limit 1
) 

См. Демонстрационную версию . Результаты:

| Company | MeterCode | Name | LastDate  |
| ------- | --------- | ---- | ----------|
| A       | 4         | MeD  | 01/02/20  |
| B       | 4         | MeH  | 02/02/20  |
0 голосов
/ 21 апреля 2020

Это вариант запроса

Вот решение, которое работает в MySQL 8.0 и поддерживает оконные функции :

SELECT t.Company, t.MeterCode, t.Name, t.LastDate
FROM (
    SELECT Company, MeterCode, Name, LastDate,
      ROW_NUMBER() OVER (PARTITION BY Company ORDER BY LastDate DESC) AS rownum
    FROM WhateverYourTableNameIs
) AS t
WHERE t.rownum = 1

Вы можете спросить: "а что, если я не использую MySQL 8.0?"

MySQL 8.0 в выпуске GA уже два года. Я думаю, что пришло время начать говорить людям, что они должны обновить, если они хотят функции, которые он поддерживает.

...