Sql 基于重复值添加唯一标识符
使用MS-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
-----------------------------------
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”上的@balajiASCII
将返回65,“B”66等。因此,根据@Y-O的要求,减去64得到1、2等。