使用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代码方面的任何帮助都将有所帮助。 谢谢!
答案 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)