关于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将如何使用多个表达式创建分区?
答案 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
时,分组键是a
和b
。 group by letter, number
的分组键是a,10
,b,10
和b,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
在第一种情况下,我们为每个卖方生成单独的行号系列。反过来,此系列按数量升序排列。在第二种情况下,该系列被重新定义为sellerid
和salesid
的组合。由于这种组合实际上对于整个表始终是唯一的,因此生成的行号始终始终为1。
您可能会说,在这里使用ROW_NUMBER
的第二版本没有多大意义。通常,例如,如果给定的卖方和销售可能有多个行,并且您想为这多个行分配一个序列,则可以使用它。
已验证:-