sql-server分组

Art*_*yan 3 sql t-sql sql-server

我有以下数据

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
          );
Run Code Online (Sandbox Code Playgroud)

我想把我的客户分成小组.例如,客户1和2具有完全相同的排名,它们必须位于单个组中,客户3和4必须位于不同的组中.预期的结果是

Grp  costumerID
---- -----------
gr1  1
gr1  2
gr2  3
gr2  4
Run Code Online (Sandbox Code Playgroud)

Luk*_*zda 5

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

DBFiddle演示