Функция teradata max с повторяющимися строками

Какое значение будет возвращено, если мы воспользуемся следующей функцией и почему?

МАКС (СЛУЧАЙ, КОГДА ИМЯ = 'ABC' ТОГДА ПОЛ КОНЕЦ) КАК СЕКС

Где у нас следующие две строки в таблице

GENDER        NAME
      M                ABC
      F                 ABC

Он не возвращает строку, а возвращает значение.

Andrew 13.09.2018 21:38

Да .. скажи мне какое значение

Santosh Suplepatil 13.09.2018 21:40

Возможный дубликат Функция Teradata MAX с повторяющейся строкой

JNevill 13.09.2018 21:40

@SantoshSuplepatil Запустите это самостоятельно в своей системе. Это было бы несложно проверить. Однако ответ - M, поскольку M лучше, чем F и оба наших ABC.

JNevill 13.09.2018 21:41

Итак, вы имеете в виду, что он будет давать seq no буквам A-Z как 1-26 ??

Santosh Suplepatil 13.09.2018 21:44

Поскольку Gender не является числовым, он будет использовать лексикографический порядок для определения сортировки / макс. Он будет выводить буквально M. Это просто сортировка, как и в случае с SELECT * FROM yourtable ORDER BY gender

JNevill 13.09.2018 21:47

Это немного странно. У вас нет доступа к Терадате? Вопросы для Stack Overflow обычно такие: «Как я могу сделать X?» а не «Что произойдет, если я сделаю X?». Просто сделай это и посмотри.

Error_2646 13.09.2018 21:50

@ Error_2646 Я знаю ответ, но сомневался, почему был возвращен M, и теперь JNEVILL устраняет сомнения.

Santosh Suplepatil 13.09.2018 21:57
0
8
347
1

Ответы 1

Вот тест, который вы можете запустить в своей собственной системе (Teradata studio, SQL Assistant, Atanasuite, bteq или что-то еще, что вы используете):

CREATE VOLATILE TABLE test2
(
    f1 CHAR(1),
    f2 CHAR(3)
) PRIMARY INDEX (f1) ON COMMIT PRESERVE ROWS;
INSERT INTO test2 VALUES ('M', 'ABC');
INSERT INTO test2 VALUES ('F', 'ABC');

SELECT MAX(CASE WHEN f2='ABC' THEN f1 END) FROM test2;

DROP TABLE test2;

Это выведет M

Происходит то, что ПЕРЕД агрегацией создается промежуточный набор результатов из всех строк для столбца f1. Для этого одного столбца устанавливается любое значение в f1 или NULL в зависимости от вашего оператора CASE:

Набор промежуточных результатов:

col1
-----
M
F

Обе строки возвращают что-то, поскольку в обеих есть Name, равный ABC. Теперь мы возьмем Max() как следующий шаг в этом порядке операций SQL.

Максимальное из двух значений M и F: M, потому что M находится выше по алфавиту (лексикографическая сортировка).

Я рад слышать это! Лексикографическая сортировка иногда может быть головной болью. Особенно, если вы перейдете к буквенно-цифровым цифрам, таким как M0123, M9, MA1 ... тогда какой из них будет Max()? ;)

JNevill 13.09.2018 22:04

Думаю должна быть МА1

Santosh Suplepatil 13.09.2018 22:11

Вы знаете больше, чем показываете!

JNevill 13.09.2018 22:13

Другие вопросы по теме