【问题标题】:SQL : MAX() OVER (PRITITON BY ... ORDER BY ..) : ORDER BY Clause is working looks likeSQL : MAX() OVER (PARTITION BY ... ORDER BY ..) : ORDER BY 子句的工作看起来像
【发布时间】:2019-03-21 11:44:10
【问题描述】:

我正在尝试使用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 聚合之前未应用。有没有其他办法?

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

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

【问题讨论】:

  • “结果为 40”是什么意思?这会在每一行添加一个具有不同结果的单独列。
  • 是的,据我所知,它将提供一个单独的列。我的意思是这里单独列的值
  • “我希望 MAX(col1) 中的值按 col3 ASC 顺序排序并按 col2 分区”和“按 ... 的顺序在 .. ."。鉴于 MAX() 的结果永远不会受到聚合输入的任何 ORDER 的影响,是什么让您认为它很重要?您需要更清楚、更准确地说明您的问题陈述。

标签: sql hive teradata


【解决方案1】:

评论太长了。对于这个表达式:

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

【讨论】:

  • 你没有得到问题。 MIN 对我不起作用。我稍微修改了这个问题,增加了一行来澄清。我希望 MAX(col1) 中的值按 col3 ASC 顺序排序并按 col2 分区
【解决方案2】:

PARTITION BY 将聚合不同的 col2 值。因此,三个 col2 'A' 值的 MAX() 值为 40。

如果您想返回“35”。这表明 A1 是分区中返回的第一行。 First_Value() 可用于返回分区组中的第一行。

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

【讨论】:

  • 这不会在我修改后的问题陈述中返回 35
  • 这确实返回 35 -- 见这里:dbfiddle.uk/…
  • 是的,这适用于本示例,但不适用于我的实际问题。
  • 您需要在问题中指定其他标准。我不确定你还问什么。
  • 有没有我们可以就实际问题陈述进行讨论和共享桌面?
【解决方案3】:

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

样本数据(作为表变量)

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

【讨论】:

  • 有时老派的事情会给人带来很多痛苦......无论如何,你的结果不是预期的。当 col2=A 时,我期望的 mx 值为 35,因此您的结果不正确
  • 我有点太快了@KoushikChandra。已修复仍然使用连接但使用 row_number 来获取正确的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2020-08-06
  • 1970-01-01
相关资源
最近更新 更多