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

Хорошо, у меня есть строка в таблице.В этой строке восемь полей типа даты.

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

Например:

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 18 января 2011

Требуется функция GREATEST :

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

Имейте в виду типы данных - не хочу сравнивать строки, которые должны быть DATE / и т.д.

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

0 голосов
/ 18 января 2011

Жаль, что в 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
...