mySQL - выбор самой последней строки в таблице - PullRequest
0 голосов
/ 07 апреля 2020

Я использую mySQL v5.7.29 MySQL Сервер совместной работы (GPL)

У меня есть таблица, в которой я создаю уникальный индекс, чтобы избежать вставки повторяющихся значений, в следующих столбцах (все столбцы, кроме временная метка Updated):

CREATE UNIQUE INDEX daily_unique ON daily(`Contract Date`, `Delivery`, `Product`, `Region`, `Price`)

Мне нужно выбрать самую последнюю запись по состоянию (метка времени).

Я пробовал следующее:

SELECT * FROM daily
WHERE updated = ( SELECT max(Updated) FROM daily ) 

Однако, поскольку существует несколько элементов «Доставка», «Продукт», «Регион», вышеприведенное не работает.

Вот выдержка из записей:

     Contract Date    Delivery      Product Region   Price   Updated
0    2020-04-06       2020-04-01    A       B        1       2020-04-06 23:00:17
1    2020-04-06       2020-04-01    A       B        2       2020-04-07 10:30:16

Мне нужен запрос для возврата самой последней записи. только (каждый комплект поставки, продукта и региона должен возвращать только одну дату и цену контракта).

     Contract Date    Delivery      Product Region   Price   Updated
1    2020-04-06       2020-04-01    A       B        2       2020-04-07 10:30:16

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Если вы используете MySQL 8+, то ROW_NUMBER - это путь к go здесь:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Delivery, Product, Region
                                 ORDER BY Updated DESC) rn
    FROM daily
)

SELECT `Contract Date`, Delivery, Product, Region, Price, Updated
FROM cte
WHERE rn = 1;

Будет подсчитан номер строки выше, начиная с 1 с самого последнего обновления запись, для каждой группы доставки / продукта / региона записи. Затем мы запрашиваем у CTE сохранение только самой последней записи для каждой группы.

На всякий случай, если вы используете более раннюю версию MySQL, есть еще один способ сделать это:

SELECT d1.`Contract Date`, d1.Delivery, d1.Product, d1.Region, d1.Price, d1.Updated
FROM daily d1
INNER JOIN
(
    SELECT Delivery, Product, Region, MAX(Updated) AS MaxUpdated
    FROM daily
    GROUP BY Delivery, Product, Region
) d2
    ON d1.Delivery = d2.Delivery AND
       d1.Product  = d2.Product AND
       d1.Region   = d2.Region AND
       d1.Updated  = d2.MaxUpdated;
1 голос
/ 07 апреля 2020

Вы также можете использовать коррелированный подзапрос:

SELECT d.*
FROM daily d
WHERE d.updated = (SELECT MAX(d1.updated)
                   FROM daily d1 
                   WHERE d.Delivery = d1.Delivery AND
                         d.Product  = d1.Product AND
                         d.Region   = d1.Region AND
                  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...