按多个表达式划分

时间:2019-03-13 08:49:21

标签: sql amazon-redshift window-functions

关于ROW_NUMBER Window Function的语法,以下是有关PARTITION BY的内容:-

PARTITION BY expr_list

可选。定义ROW_NUMBER函数的一个 或更多表达式

我希望了解如果 expr_list 在Partition By中具有多个表达式的情况下,将如何工作:-

https://docs.aws.amazon.com/redshift/latest/dg/r_Examples_of_WF_ROW_NUMBER_WF.html

可以说,如果替换了以下内容:-

row_number() over (partition by sellerid order by qty asc) as row

通过以下操作:-

row_number() over (partition by sellerid,salesid order by qty asc) as row

然后partition by将如何使用多个表达式创建分区?

2 个答案:

答案 0 :(得分:0)

GROUP BY的工作方式相同:

--example data
letter, number, bool
a, 10, true
a, 10, false
b, 10, true
b, 10, false
b, 20, true
b, 20, false


--count(*) GROUP  BY letter
a, 2
b, 4

--count(*) GROUP BY letter, number
a, 10, 2
b, 10, 2
b, 20, 2

在分组依据中,对列值的唯一组合进行计数。

  • 当我们group by letter时,分组键是ab
  • 当我们group by letter, number的分组键是a,10b,10b,20

如果我要将此行编号:

--row_number() over(partition by letter ...)
a, 1
a, 2
b, 1
b, 2
b, 3
b, 4

--row_number() over(partition by letter, number ...)
a, 10, 1
a, 10, 2
b, 10, 1
b, 10, 2
b, 20, 1
b, 20, 2

答案 1 :(得分:0)

PARTITION BY子句确定将使用哪些列来定义给定的分区。可以用一些示例数据来解释这一点:

sellerid | salesid | qty
1        | 1       | 1
1        | 2       | 10
1        | 3       | 5
2        | 4       | 10
2        | 5       | 7

考虑您的第一个和第二个查询:

ROW_NUMBER() OVER (PARTITION BY sellerid ORDER BY qty) rn1
ROW_NUMBER() OVER (PARTITION BY sellerid, salesid ORDER BY qty) rn2

这将生成以下值:

sellerid | salesid | qty | rn1 | rn2
1        | 1       | 1   | 1   | 1
1        | 2       | 10  | 3   | 1
1        | 3       | 5   | 2   | 1
2        | 4       | 10  | 2   | 1
2        | 5       | 7   | 1   | 1

在第一种情况下,我们为每个卖方生成单独的行号系列。反过来,此系列按数量升序排列。在第二种情况下,该系列被重新定义为selleridsalesid的组合。由于这种组合实际上对于整个表始终是唯一的,因此生成的行号始终始终为1。

您可能会说,在这里使用ROW_NUMBER的第二版本没有多大意义。通常,例如,如果给定的卖方销售可能有多个行,并且您想为这多个行分配一个序列,则可以使用它。

已验证:-

Verified SQL code