根据重复值添加唯一标识符

时间:2019-09-19 11:10:31

标签: sql sql-server tsql

使用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

如果将使用市场“ D”添加新行,则它将获得组1。 如果将添加一个新行,其中没有出现“市场空值”和“周期”,它将开始一个新的组5。具有相同周期的以后的行也将获得5。

希望这很清楚... SQL Server代码方面的任何帮助都将有所帮助。 谢谢!

2 个答案:

答案 0 :(得分:0)

这将以您想要的方式设置Group值,尽管它看起来不太雅致:

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

...或通过以下方式选择它:

SELECT *, ASCII(COALESCE(Market, Cycle, Milestone, Sale)) - 64 AS Group
FROM tblGroup

答案 1 :(得分:0)

您可以将窗口函数用作

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)

Online Demo