sql:max()over(prititon byORDERBY..):ORDERBY子句正在工作,如下所示

uplii1fm  于 2021-06-27  发布在  Hive
关注(0)|答案(3)|浏览(331)

我想用 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作为我的结果。看起来像
在max aggregate之前未应用order by col3。还有别的办法吗?
我不会写这本书 `row_number()` 在where子句中,当我们试图创建列时,它周围有许多列和复杂的逻辑。
目前我正在尝试它 `Teradata` ,但实际上它将在 `HIVE` . 
6tdlim6h

6tdlim6h1#

这太长了,不能发表评论。对于此表达式:

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 ()
5q4ezhmt

5q4ezhmt2#

PARTITION BY 将在distinct上聚合 col2 价值观。因此 MAX() 三个col2'a'值的值为40。
如果要返回“35”。这表明a1是分区中返回的第一行。first_value()可用于返回分区组中的第一行。

FIRST_VALUE(CASE WHEN col4 = 'ABC' THEN col1 
                 ELSE 0 END) OVER (PARTITION BY col2 order by col3)
xfb7svmp

xfb7svmp3#

编辑:移动到子查询中的窗口函数以获得正确的行
样本数据(作为表变量)

declare @t table(col1 int,col2 char(1),col3 char(2),col4 char(3))
insert @t values (30,'A','B1','ABC')
,(35,'A','A1','ABC')
,(36,'A',NULL,NULL)
,(40,'A','X1','ABC')
,(50,'B','M1','ABD')

使用row\ u number()查询以获取要加入的行

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

相关问题