SQL: MAX () OVER (PRITITON BY ... ORDER BY ..): предложение ORDER BY работает следующим образом - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь использовать MAX(case when col4='ABC' then col1 else 0 end) OVER (PARTITION BY col2 order by **col3**)

col1~col2~col3~col4
30    A    B1   ABC
35    A    A1   ABC
36    A    NULL NULL
40    A    X1   ABC
50    B    M1   ABD

, но получаю результат как 40, но я хочу 35 как мой результат.Похоже, что

порядок по col3 не применяется до агрегирования MAX.Есть ли другой способ?

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

В настоящее время я пробую это в Teradata, но на самом деле это будет реализовано в HIVE.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

PARTITION BY будет агрегироваться для различных значений col2.Таким образом, значение MAX() трех значений «A» для col2 равно 40.

Если вы хотите вернуть «35».Это говорит о том, что A1 - это первая строка, возвращенная в разделе.First_Value () может использоваться для возврата первой строки в группе разделов.

FIRST_VALUE(CASE WHEN col4 = 'ABC' THEN col1 
                 ELSE 0 END) OVER (PARTITION BY col2 order by col3)
0 голосов
/ 17 октября 2018

РЕДАКТИРОВАТЬ: Перешли к функции окна в подзапросе, чтобы получить правильную строку

select t.*, mx
from @t t
join (
    select 
        col2, 
        case when col4='ABC' then col1 else 0 end as mx, 
        row_number() over (PARTITION BY col2 order by case when col3 is null then 1 else 0 end, col3) rn
    from @t
    ) m on m.col2=t.col2 and rn=1

Результат:

col1    col2    col3    col4    col2    mx
30      A       B1      ABC     A       35
35      A       A1      ABC     A       35
36      A       NULL    NULL    A       35
40      A       X1      ABC     A       35
50      B       M1      ABD     B       0
0 голосов
/ 17 октября 2018

Это слишком долго для комментария.Для этого выражения:

MAX(case when col4 = 'ABC' then col1 else 0 end) OVER (PARTITION BY col2 order by col3)

Вы должны получить:

col1~col2~col3~col4
30    A    A1   ABC   30
40    A    X1   ABC   40
50    B    M1   ABD    0

Если вы хотите «30» для всех, вы можете рассмотреть:

min(case when col4 = 'ABC' then col1 end) over ()
...