2014-09-22 4 views
3

Не могли бы вы сообщить мне запрос в oracle, чтобы найти наибольшее из трех столбцов в 10 строках.SQL-запрос, чтобы найти наибольшее количество в столбцах и строках

Требование: у меня есть три столбца дат, и мне нужно найти наибольшее из трех столбцов в 10 строках. Я знаю, что величайший найдет в одном ряду.

Любой запрос поможет в этом, я использую oracle 11g.

+0

Так что вы хотите, наибольшее значение всех тридцати значений? Или вы хотите получить наибольшее значение за столбец (всего три значения)? –

ответ

3

Как насчет

select max(greatest(date1, date2, date3, date4)) from my_table; 
+0

Я не совсем был уверен в количестве столбцов даты, которые у вас были. Вы указываете 4 столбца в своем первом предложении, но затем укажите три столбца даты во втором предложении. – pjd

+0

Это лучший способ сделать это – FuzzyTree

+0

Есть ли значение, чтобы игнорировать нулевое значение, отличное от использования nvl? Я хочу игнорировать столбец из самых больших. – Hari

2

вы можете использовать greatest снова в вашем order by

select * from (
    select greatest(c1,c2,c3,c4) from mytable 
    order by greatest(c1,c2,c3,c4) desc 
) t1 where rownum = 1 
1
With data as(
    Select col1 dt from table union all 
    Select col2 from table union all 
    Select col3 from table union all 
    Select col4 from table 
) 
Select max(dt) max_dt 
    from data 
/

Предполагая, 4 колонки DATE типа данных. Используется только MAX, а не GREATEST.

Обновление: Расширение хороший пункт, упомянутый @Thorsten в комментарии ниже

Проблема с GREATEST() функцией является то, что всякий раз, когда вам нужно обрабатывать NULL значения, передаваемых на него, вы должны использовать NVL чтобы получить правильный выход. Были многочисленные вопросы по этому вопросу, такие как «Как избежать значений NULL с функцией GREATEST» и т. Д.

Примечание: с точки зрения производительности, пожалуйста, протестируйте его перед применением такой логики в рабочей среде.

+1

Таким образом, избегая проблемы с NULL GREATEST. Это медленнее, но делает все, что нужно. +1 –

+0

@Thorsten, два хороших момента. Спасибо, что упомянул. Проблема NULL уже была в моем сознании, отправляя ответ. Но, что касается выполнения запроса, я был бы очень обеспокоен. Но с новыми версиями и лучшими инструментами моя забота действительно не очень важна. Но да, устаревшие системы могут быть не такими эффективными. –

0

Вот два способа обойти проблему NULL GREATEST (т. Е. Проблема, с которой GREATEST не только возвращает NULL, когда все значения имеют значение NULL, но уже, когда хотя бы одно значение имеет значение NULL, что делает работу с GREATEST часто неприятной).

Для n столбцов вы можете использовать выражения n COALESCE. Каждое выражение должно содержать все столбцы, каждый из которых начинается с другого столбца.

select 
    max(
    greatest(
     coalesce(col1,col2,col3,col4),  
     coalesce(col2,col3,col4,col1), 
     coalesce(col3,col4,col1,col2),  
     coalesce(col4,col1,col2,col3) 
    ) 
) 
from mytable; 

Альтернативой является не использование GREATEST вообще, а сравнение с CASE и COALESCE. Каждое значение сравнивается со всеми другими значениями. col1 >= coalesce(col2,col1) гарантирует, что col1 считается большим или равным эксфону, когда col2 равен NULL, если сам col1 не является NULL. В CASE все столбцы имеют значение NULL, значение CASE по умолчанию равно NULL. (Можно было бы добавить else NULL сделать это видимым для неопытный читателя.)

select 
    max(
    case 
     when col1 >= coalesce(col2,col1) and col1 >= coalesce(col3,col1) and col1 >= coalesce(col4,col1) then col1 
     when col2 >= coalesce(col1,col2) and col1 >= coalesce(col3,col2) and col1 >= coalesce(col4,col2) then col2 
     when col3 >= coalesce(col1,col3) and col1 >= coalesce(col2,col3) and col1 >= coalesce(col4,col3) then col3 
     when col4 >= coalesce(col1,col4) and col1 >= coalesce(col2,col4) and col1 >= coalesce(col3,col4) then col4 
    end 
) 
from mytable;