разбиение по нескольким выражениям - PullRequest
0 голосов
/ 13 марта 2019

Применительно к синтаксису Функция окна ROW_NUMBER о 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

Тогда как разделение будет создавать раздел с использованием нескольких выражений?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Предложение 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 здесь. В общем, вы бы использовали его, если, например, у данного продавца и продажа может быть более одной строки, и вы хотите назначить последовательность для этих нескольких строк.

Проверено: -

Verified SQL code

0 голосов
/ 13 марта 2019

Так же, как работает 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
...