Добавление уникального идентификатора на основе повторяющихся значений - PullRequest
0 голосов
/ 19 сентября 2019

Используя MS-SQL, у меня есть следующий отрывок таблицы:

-----------------------------------
Market | Cycle | Milestone | Sale |
  A    | NULL  |  NULL     | NULL | 
  A    |   1   |  NULL     | NULL | 
  B    | NULL  |  NULL     | NULL | 
  B    |   3   |     4     | NULL | 
  B    |   3   |     4     |  5   | 
  A    |   1   |     2     | NULL | 
  A    |   1   |     2     |  1   | 
 NULL  |   C   |     6     |  7   | 
 NULL  |   C   |  NULL     | NULL | 
  D    |   8   |  NULL     | NULL | 
  D    |   8   |     9     | NULL | 

Каждая строка представляет новый этап в жизненном цикле продукта.Если первой стадией продукта C был Cycle, в следующей строке для него будут значения Cycle и Milestone и т. Д.Мне нужно добавить идентификатор для каждой группы на основе первого ненулевого столбца для каждого значения.

Требуемый вывод для приведенной выше таблицы будет следующим:

-------------------------------------------
Market | Cycle | Milestone | Sale | Group
  A    | NULL  |  NULL     | NULL |   1
  A    |   1   |  NULL     | NULL |   1
  B    | NULL  |  NULL     | NULL |   2
  B    |   3   |     4     | NULL |   2
  B    |   3   |     4     |  5   |   2
  A    |   1   |     2     | NULL |   1
  A    |   1   |     2     |  1   |   1
 NULL  |   C   |     6     |  7   |   3
 NULL  |   C   |  NULL     | NULL |   3
  D    |   8   |  NULL     | NULL |   4
  D    |   8   |     9     | NULL |   4

Еслиновая строка будет добавлена ​​с Market "D", она получит Группу 1. Если новая строка будет добавлена ​​с Market Null и Cycle, которые еще не появились, она начнет новую группу 5. Будущие строки с тем же цикломтакже получит 5.

Надеюсь, это достаточно ясно ... Любая помощь с кодом SQL-Server для этого будет полезна.Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Вы можете использовать оконную функцию как

SELECT *, DENSE_RANK() OVER(ORDER BY Market) [Group]
-- Or DENSE_RANK() OVER(ORDER BY COALESCE(Market, Cycle)) [Group] to get the exact results 
FROM
(
  VALUES
  ('A',  NULL, NULL, NULL),
  ('A',  '1', NULL, NULL),
  ('B',  NULL, NULL, NULL),
  ('B',  '3',    4, NULL), 
  ('B',  '3',    4,  5  ), 
  ('A',  '1',    2, NULL), 
  ('A',  '1',    2,  1  ), 
  (NULL, 'C',    6,  7  ), 
  (NULL, 'C', NULL, NULL), 
  ('D',  '8', NULL, NULL), 
  ('D',  '8',    9, NULL)
)T(Market, Cycle, Milestone, Sale)

Онлайн-демонстрация

0 голосов
/ 19 сентября 2019

Это установит значение Group так, как вы хотите, хотя оно выглядит не элегантным:

UPDATE tblGroup
SET Group = ASCII(COALESCE(Market, Cycle, Milestone, Sale)) - 64

... или выберите его с помощью:

SELECT *, ASCII(COALESCE(Market, Cycle, Milestone, Sale)) - 64 AS Group
FROM tblGroup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...