Строки группы SQL в пары - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь добавить какой-то уникальный идентификатор (uid) в разделы, состоящие из пар строк, то есть сгенерировать некоторый uid / тег для каждых двух строк (identifier1, identifier2) в разделе окна с размером = 2 строки .

Так, например, первые 2 строки для идентификатора X получат идентификатор A, следующие две строки для того же идентификатора получат идентификатор B и, если в разделе остается только одна строка для идентификатора X, это получит идентификатор С.

Вот что я пытаюсь выполнить, на рисунке показана структура таблицы, я вручную добавил ожидаемый идентификатор, чтобы проиллюстрировать цель:

enter image description here

Это мой текущий SQL, ntile не решает его, потому что размер раздела варьируется:

select
rowId
, ntile(2) over (partition by firstIdentifier, secondIdentifier order by timestamp asc) as ntile
, *
from log;

Уже пробовал ntile ((count (*) для раздела ...) / 2), но это не работает.

Генерация UID может быть выполнена с помощью md5 () или аналогичной, но у меня возникают проблемы с маркировкой строк, как показано выше (поэтому я могу md5 сгенерировать тег / uid)

Ответы [ 2 ]

0 голосов
/ 10 мая 2018
select *, char(65 + (row_number() over(partition by 
firstidentifier,secondidentifier order by timestamp)-1)/2) 
expectedidentifier from log 
order by firstidentifier, timestamp

Вот версия сервера Sql

with log (firstidentifier,secondidentifier, timestamp)
as (
select 15396, 14460, 1 union all
select 15396, 14460, 1 union all
select 19744, 14451, 1 union all
select 19744, 14451, 1 union all
select 19744, 14451, 1 union all
select 15590, 12404, 1 union all
select 15590, 12404, 1 union all
select 15590, 12404, 1 union all
select 15590, 12404, 1 union all
select 15590, 12404, 1 
)
select *, char(65 + (row_number() over(partition by 
firstidentifier,secondidentifier order by timestamp)-1)/2) 
expectedidentifier from log 
order by firstidentifier,secondidentifier,timestamp
0 голосов
/ 10 мая 2018

Хотя count (*) не поддерживается в оконной функции Snowflake, count (1) поддерживается и может использоваться для создания уникального идентификатора. Ниже приведен пример целочисленного уникального идентификатора, сопоставляющего пары строк и обрабатывающего «нечетные» группы строк:

select 
ntile(2) over (partition by firstIdentifier, secondIdentifier order by timestamp asc) as ntile
,ceil(count(1) over( partition by firstIdentifier, secondIdentifier order by timestamp asc) / 2) as id
, *
from log;
...