Группировать значения по первому значению группы - PullRequest
0 голосов
/ 11 июня 2018

Я хочу сгруппировать значения по первому значению группы, но мне кажется, что я слепой.Пример таблицы

COL_1     COL_2   COL_3        ROW_ID
A         AA      2017-01-01   1
A         BB      2017-01-05   2
A         BB      2017-01-21   3
A         AA      2017-01-22   4
A         BB      2017-01-23   5
A         BB      2017-01-24   6
B         AA      2017-01-01   7
B         BB      2017-01-05   8
B         BB      2017-01-22   9
B         AA      2017-01-24   10
C         BB      2017-01-01   11 

Результат должен выглядеть следующим образом

COL_1     COL_2   COL_3        ROW_ID  Group
A         AA      2017-01-01   1       1
A         BB      2017-01-05   2       1
A         BB      2017-01-21   3       1        
A         AA      2017-01-22   4       2
A         BB      2017-01-23   5       2
A         BB      2017-01-24   6       2
B         AA      2017-01-01   7       3
B         BB      2017-01-05   8       3
B         BB      2017-01-22   9       3
B         AA      2017-01-24   10      4
C         AA      2017-01-01   11      5

Номер группы также может быть номером первого идентификатора каждой группы или любого другого имени., но должен быть уникальным.Я не хочу использовать курсор, просто простой T-SQL от SQL-SERVER 2012 и выше

Я думаю, что ответ имеет отношение к LAG и PARTITION OVER, но не нашел решения ...,Пока что

Есть идеи?Приветствия, Алекс

РЕДАКТИРОВАТЬ Решение от @Gordon с небольшим изменением

select t.*,
  col_1 + '_' + CONVERT(VARCHAR,sum(case when col_2 = 'AA' then 1 else 0 end) over (order by rowid)) as grp
from t;

Еще раз спасибо Гордон

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Если я правильно понимаю, вы хотите посчитать число 'AA' до каждого значения.Если так:

select t.*,
      sum(case when col_2 = 'AA' then 1 else 0 end) over (partition by col_1 order by col3) as grp
from t;

Я предполагаю, что вам нужны отдельные группы для каждой col_1.Если это не правильно, то:

select t.*,
      sum(case when col_2 = 'AA' then 1 else 0 end) over (order by rowid) as grp
from t;

Если вы просто хотите группы по 3 и можете зависеть от row_id:

select t.*, (1 + (rowid - 1)/3) as grp
from t;
0 голосов
/ 11 июня 2018

Использовать деление с размером группы на row_number.

select t.*,1+(row_number() over(order by row_id)-1)/3 as grp
from tbl t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...