GBQ中的窗口函数按顺序排序行为规范

Posted

技术标签:

【中文标题】GBQ中的窗口函数按顺序排序行为规范【英文标题】:Sorting behavior specification in order by for window function in GBQ 【发布时间】:2021-07-03 16:21:24 【问题描述】:

我正在使用窗口函数在 GBQ 中运行查询。但我不完全知道如何指定排序行为。按列排序,我有两列,我想按它们的降序对行进行排序。为此,我在 order by 子句的末尾使用了 DESC,但我得到的是它首先按第一列的升序对行进行排序,然后对第二列进行降序。我的问题是我是否应该为每一列指定排序顺序?

这是返回错误顺序的查询:

SELECT partitionDate,
      createdUTC,
      ROW_NUMBER() OVER(PARTITION BY externalid ORDER BY partitionDate, createdUTC DESC NULLS LAST) 

另一个查询:

SELECT partitionDate,
          createdUTC,
          ROW_NUMBER() OVER(PARTITION BY externalid ORDER BY partitionDate DESC, createdUTC DESC NULLS LAST) 

【问题讨论】:

【参考方案1】:

排序顺序应按列指定,默认为 ASC,因此可以省略。所以,是的 - 您应该对每一列使用 DESC,如下所示

SELECT partitionDate,
  createdUTC,
  ROW_NUMBER() OVER(PARTITION BY externalid ORDER BY partitionDate DESC, createdUTC DESC NULLS LAST) 

【讨论】:

谢谢米哈伊尔,聚合函数有相同的规则吗?你是怎么找到答案的? 是的。普遍正确。只是非常基本的事实:o)

以上是关于GBQ中的窗口函数按顺序排序行为规范的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL中group by中的窗口函数

Hive row_number() 中的自定义排序,按窗口函数排序

C语言:写一函数,用“冒泡法”对输入的10个字符按由小到大顺序排列

hive关于窗口函数的使用

Greenplum中的First_value窗口函数

窗口函数,尝试从连接表中的列中按 created_at 排序而不分组