Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于重复值添加唯一标识符_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 基于重复值添加唯一标识符

Sql 基于重复值添加唯一标识符,sql,sql-server,tsql,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

使用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中的值,依此类推。 我需要根据每个值的第一个NOTNULL列为每个组添加一个标识符

上表所需的输出如下:

-------------------------------------------
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代码的帮助都会很有帮助。
谢谢大家!

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

UPDATE tblGroup
SET Group = ASCII(COALESCE(Market, Cycle, Milestone, Sale)) - 64
…或通过以下方式进行选择:

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

您可以使用窗口函数作为

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)

你试过什么吗?可能是
densite\u RANK()
?什么列对行进行排序?谢谢@strickt01,我尝试了RANK,densite\u RANK,groupby。。。使用稠密_秩的合并解决了这个问题!谢谢你的帮助@Y-O这里的“与稠密的_秩合并”在哪里?@strickt01——你能告诉我们为什么在你的查询中使用“-64”吗。Thanks@Sami
合并
对于返回请求的结果至关重要。使用
ASCII
而不是
densite_-RANK
更快,但灵活性更低,因为它依赖于A、B、C、D等代码。字符“A”上的@balaji
ASCII
将返回65,“B”66等。因此,根据@Y-O的要求,减去64得到1、2等。