У меня есть такая таблица:
timesent |nr | value
2018-10-31 05:23:06 | 4 | Value 3
2018-10-31 05:20:19 | 4 | Value 2
2018-10-31 05:19:35 | 4 | Value 1
2018-10-31 04:55:56 | 3 | Value 2
2018-10-31 03:05:15 | 3 | Value 1
2018-10-31 01:31:49 | 2 | Value 1
2018-10-30 04:11:16 | 1 | Value 1
На данный момент мой выбор выглядит так:
SELECT * FROM values WHERE ORDER BY timesent DESC
Я хочу сделать оператор sql-select, который возвращает мне только самое последнее значение каждого «nr».
Мои навыки недостаточно хороши, чтобы перевести это в sql-оператор. Я даже не знаю, зачем мне гуглить.
Values
- это Зарезервированное ключевое слово в MySQL. Подумайте о том, чтобы изменить название вашей таблицы на другое; в противном случае вам придется использовать обратные кавычки вокруг него
Есть разные способы добиться результата для вашей проблемы. Один из способов - выполнить «Самостоятельное левое соединение» на nr
(поле, в котором вы хотите получить только строку максимального значения timesent
).
SELECT v1.*
FROM `values` AS v1
LEFT JOIN `values` AS v2
ON v1.nr = v2.nr AND
v1.timesent < v2.timesent
WHERE v2.nr IS NULL
Для Версия MySQL> = 8.0.2 вы можете использовать Оконные функции. Мы определим Row_Number()
для каждой строки в разделе nr
, с timesent
в порядке убывания (наивысшее значение timesent
будет иметь номер строки = 1). Затем используйте этот набор результатов в Производная таблица и учитывайте только те строки, где номер строки равен 1.
SELECT dt.timesent,
dt.nr,
dt.value
FROM
(
SELECT v.timesent, v.nr, v.value,
ROW_NUMBER() OVER (PARTITION BY v.nr
ORDER BY v.timesent DESC) AS row_num
FROM `values` AS v
) AS dt
WHERE dt.row_num = 1
Тем не менее, другой подход состоит в том, чтобы получить максимальное значение timesent
для группы nr
в производной таблице. Теперь присоедините этот набор результатов к основной таблице, чтобы отображались только строки, соответствующие максимальному значению:
SELECT v.timesent,
v.nr,
v.value
FROM
`values` AS v
JOIN
(
SELECT nr, MAX(timesent) AS max_timesent
FROM `values`
GROUP BY nr
) AS dt ON dt.nr = v.nr AND
dt.max_timesent = v.timesent
Спасибо большое за вашу помощь. Боже мой - ничего не понимаю. Что означают «v1.», «V» и «dt.» Перед именами столбцов?
@Andreasschnetzer Это псевдонимы. Они делают запрос читаемым и однозначным, когда он включает несколько таблиц / подзапросов и т. д. Пройдите это руководство: mysqltutorial.org/mysql-alias
Спасибо. Я сделаю это. Я посмотрел ваш профиль, и вы входите в 1% респондентов mysql. - Это видно :) - Ты чертовски хорош
@Andreasschnetzer спасибо за добрые слова. Если требуется какое-либо объяснение по этим шагам; дайте мне знать; Обновлю ответ. Если этот ответ вам помог, подумайте о том, чтобы пометить его как принятый, а также проголосуйте за него. Спасибо :)
Спасибо за ваш ответ. Я не понимаю этого прямо сейчас, но попытаюсь разобраться. :)