我有以下数据
CREATE TABLE customers (ID INT, rankVal INT);
GO
INSERT INTO dbo.customers( ID, rankVal )
VALUES ( 1, -- ID - int
1 -- rankVal - int
),
( 1, -- ID - int
2 -- rankVal - int
),
( 2, -- ID - int
1 -- rankVal - int
),
( 2, -- ID - int
2 -- rankVal - int
),
( 3, -- ID - int
1 -- rankVal - int
),
( 3, -- ID - int
3 -- rankVal - int
),
( 4, -- ID - int
1 -- rankVal - int
),
( 4, -- ID - int
3 -- rankVal - int
);
我想将客户分组。例如,客户 1 和 2 具有完全相同的 rankvals,他们必须在一个组中,客户 3 和 4 必须在不同的组中。预期结果是
Grp costumerID
---- -----------
gr1 1
gr1 2
gr2 3
gr2 4
最佳答案
您可以使用 STRING_AGG
(SQL Server 2017 及更高版本)将所有排名合而为一,然后使用 DENSE_RANK
计算组数:
WITH cte AS (
SELECT ID, STRING_AGG(rankVal,',') WITHIN GROUP (ORDER BY rankVal) AS s
FROM customers
GROUP BY ID
)
SELECT CONCAT('grp', DENSE_RANK() OVER(ORDER BY s)) AS GRP, ID AS customerID
FROM cte;
关于sql-server 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46816440/