Запрос на поиск максимального значения в строке, а не в столбце - SQL / MySQL

0

Итак, у меня есть строка в таблице. Эта строка имеет восемь полей типа даты.

Я пытаюсь написать запрос, который возвращает наивысшее значение даты из строки.

Например:

    NULL,NULL,2009-10-09,2010-03-12,2010-04-15,2010-06-23,2010-08-27,NULL

Запрос при выполнении против указанной выше таблицы возвращает следующее значение для этой строки: 2010-08-27

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

Есть ли другие варианты, доступные мне? Или у кого-то есть решение, которое они успешно выполнили?

Оцените любую помощь, которая может быть предложена.:)

Теги:
max

2 ответа

5
Лучший ответ

Вам нужна функция GREATEST:

SELECT GREATEST(col1, col2, col3, col4, col5, col6, col7, col8) AS max_date
  FROM YOUR_TABLE

Обратите внимание на типы данных. Не хотите сравнивать строки, которые должны быть DATEs/etc.

Жаль, что SQL Server этого не имеет, но, к счастью, Oracle и PostgreSQL делают.

  • 0
    Так что я был бы прав, предполагая, что значения NULL будут выбрасывать эту функцию?
  • 0
    @Linnay: зависит от версии - подробности смотрите в документации. Для версии 5.0.13+ попробуйте использовать COALESCE или IFNULL вокруг каждой ссылки на столбец, чтобы установить надежно минимальное значение.
Показать ещё 2 комментария
0

Жаль, что SQL Server этого не имеет, но, к счастью, Oracle и PostgreSQL делают.

Но SQL Server допускает другие вещи, такие как выбор без таблицы (нет бизнеса "FROM DUAL", MySQL тоже поддерживает это), а также подзапросы, которые ссылаются на таблицу 2, как на запрос ниже

select a,b,c,d,
    (
    select max(a)
    from
        (select a union all
         select b union all
         select c union all
         select d) columnstorows
    ) greatest
from (select 1 as a,2 as b,null as c,4 as d) virtualtable

Нет ISNULL бизнеса, просто макс.

Как упоминал OMG Ponies, MySQL GREATEST требует IFNULL вокруг каждого столбца. Но даже это не весь ответ. Если вы используете IFNULL и предоставляете "виртуальный минимум" для каждого, вы можете получить неправильный ответ, когда все значения равны нулю. Вы должны IFNULL их в другой столбец, либо поверните их, либо просто любой другой столбец действительно сделает.

select
a,b,c,d,
greatest(ifnull(a,b), ifnull(b,c), ifnull(c,d), ifnull(d,a))
from (select 1 as a,2 as b,null as c,4 as d) virtualtable

Ещё вопросы

Сообщество Overcoder
Наверх
Меню