首页 > 解决方案 > SQL : MAX() OVER (PRITITON BY ... ORDER BY ..) : ORDER BY 子句的工作看起来像

问题描述

我正在尝试使用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 聚合之前未应用 col3 的顺序。还有其他方法吗?

我无法编写row_number()in where 子句,因为我们正在尝试创建列,并且周围有很多列和复杂的逻辑。

目前我正在尝试它Teradata,但实际上它将在HIVE.

标签: sqlhiveteradata

解决方案


编辑:已移至子查询中的窗口函数以获取正确的行

样本数据(作为表变量)

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_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

推荐阅读