Агрегатная функция в результате в оракуле 11g

Может ли кто-нибудь сказать мне, что будет результатом максимальной функции агрегата для того же значения? Предположим, у меня есть столбец create_date, который содержит дату как varchar2. Если я попробую max(creation_date), что будет результатом и как он будет выбирать строку. Если использовать это в подзапросе where, строка предсказуема или нет?

полный запрос такой.

создать идентификатор из my_table, где create_date=(выбрать max(create_date) из моей таблицы);


person user3004656    schedule 30.03.2014    source источник
comment
Чего вы хотите достичь? Если вы хотите получить самую последнюю дату, то MAX(create_date) не даст вам того, что вы хотите. Сначала вам нужно будет преобразовать varchar2 в date.   -  person Racil Hilan    schedule 30.03.2014
comment
Хорошо ... вы даете мне подсказку. Я просто хочу знать, как агрегатная функция оракула выбирает любую строку, если все значения одинаковы   -  person user3004656    schedule 30.03.2014
comment
Он вернет одно из этих значений (он всегда будет возвращать одно значение), однако невозможно предсказать, какое из них он вернет. Пример: SELECT MAX(col) FROM tbl, где tbl.col имеет значения (1, 2, 1, 4), он вернет 1. Теперь это 1 из первой строки или из третьей строки? Нет способа сказать.   -  person Racil Hilan    schedule 30.03.2014


Ответы (1)


Не очень уверен, чего вы пытаетесь достичь. Допустим, есть таблица my_table с данными, подобными приведенным ниже. (Обратите внимание, что последние две строки имеют одинаковые данные в столбцах даты)

SQL> выберите * из my_table;

 CREATE_ID CREATE_DATE         CREATE_DATE_VARCHAR
---------- ------------------- --------------------
         1 1996-07-25 00:00:00 1996-07-25 00:00:00
         2 1997-07-26 00:00:00 1997-07-26 00:00:00
         3 2013-07-26 00:00:00 2013-07-26 00:00:00
         4 2013-07-26 00:00:00 2013-07-26 00:00:00

Если вы выполните select * from my_table where create_date_varchar=(Select max(create_date_varchar) from my_table);, вы получите 2 записи (id 3 и 4)

 CREATE_ID CREATE_DATE         CREATE_DATE_VARCHAR
---------- ------------------- --------------------
         3 2013-07-26 00:00:00 2013-07-26 00:00:00
         4 2013-07-26 00:00:00 2013-07-26 00:00:00

Если вы хотите, чтобы был выбран только один, вы можете использовать ROWNUM=1 select * from my_table where create_date_varchar=(Select max(create_date_varchar) from my_table) and ROWNUM = 1;, тогда вы получите 1 запись (из 3 или 4, это можно контролировать с помощью предложения порядка)

Проверьте: http://sqlfiddle.com/#!4/8d75a/3

См. Max Function Чтобы узнать больше о том, как работает сортировка, см. NLS_SORT и Почему порядок сортировки Oracle varchar не соответствует поведению сравнения varchar ?

person Kaushal    schedule 30.03.2014
comment
@user3004656 user3004656 И это то же самое, что и мой ответ вам в комментариях. Однако Каушал приложил дополнительные усилия, чтобы создать для вас полный пример. - person Racil Hilan; 30.03.2014