#mysql
Вопрос:
Здравствуйте, у меня есть два столбца даты и времени из нескольких строк, я хочу получить строку с последней датой(самой высокой) между двумя столбцами всех записей. Пожалуйста, проверьте ниже:
ID|Date1 |Date2
1 |2021-06-10 19:03:36 |Null
2 |2021-06-11 19:33:41 |2021-06-16 09:49:41
3 |2021-06-16 20:04:24 |Null
Я хочу получить самую высокую дату из всех записей двух столбцов(Дата 1 и Дата 2). Из приведенной выше таблицы мне нужна дата третьей строки, потому что это самая высокая дата(2021-06-16 20:04:24) из всех записей двух столбцов. Если мы изменим строку 3 столбца date1 к 2021-06-16 09:20:41, результатом будет строка 2, потому что самая высокая запись даты найдена в date2. Пожалуйста, помогите мне создать запрос mysql для получения полной строки данных
Ответ №1:
Если вам нужна только 1 строка в результатах и вас не волнуют связи, используйте GREATEST()
для получения максимальной даты в каждой строке, отсортируйте по этой максимальной дате по убыванию и LIMIT 1
выберите верхнюю строку:
SELECT *
FROM tablename
ORDER BY GREATEST(COALESCE(Date1, '1000-01-01'), COALESCE(Date2, '1000-01-01')) DESC
LIMIT 1
Если Date1
не может быть аннулировано, используйте COALESCE()
только для Date2
:
SELECT *
FROM tablename
ORDER BY GREATEST(Date1, COALESCE(Date2, '1000-01-01')) DESC
LIMIT 1
Смотрите демонстрацию.
Комментарии:
1. спасибо за предоставление полезной функции
2. @RajasthanAyurvedUniversity отлично, если это сработало, и не забудьте принять ответ, нажав на галочку.
Ответ №2:
Вы можете объединить два столбца и получить MAX()
:
SELECT MAX(dateColumns)
FROM
(
SELECT DATE1 as dateColumns FROM yourtable
UNION ALL
SELECT DATE2 FROM yourtable
) sub
Комментарии:
1. Сглазьте, если оба придумают «свой стол» независимо друг от друга. К вашему сведению: Исходный вопрос немного противоречив в том, нужно ли возвращать всю строку или только максимальную дату.
2. Это слишком смешно. Я видел, как пришел твой ответ, и даже не заметил этого. Я согласен с этой двусмысленностью. Я полагаю, что они смогут разобраться в этом, как только получат какое-то представление о том, как идентифицировать макса.
3. @JNevill Я хочу полную запись,такую как идентификатор,дата 1, дата 2
Ответ №3:
Один из способов сделать это с помощью несколько минимального SQL, где «yourtable» — это независимо от имени вашей таблицы:
select ID, Date1, Date2
from yourtable
where greatest(
coalesce(Date1,'1900-01-01'),
coalesce(Date2,'1900-01-01')
) in (
select max(greatest(
coalesce(Date1,'1900-01-01'),
coalesce(Date2,'1900-01-01')
)) from yourtable
)
Однако производительность такого рода запросов может не масштабироваться для огромных таблиц. ИЗМЕНИТЬ: Обновлено, чтобы включить объединение() нулевых дат в произвольно «раннюю» дату.
Комментарии:
1. Я бы добавил coalesce, иначе greatest даст null для тех записей, где дата 1 или дата 2 равна нулю
2. Спасибо, что указали на это. Я обновлю ответ. Есть ли лучшая ценность для объединения, чем произвольно «старая» дата?
3. Я бы использовал greatest(объединение(дата 1, дата 2), объединение(дата 2, дата 1)). это должно быть общим.