sql-server 分组

标签 sql sql-server tsql

我有以下数据

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;

DBFiddle Demo

关于sql-server 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46816440/

相关文章:

SQL Server比较有多少数据匹配,并且只在一张表中

sql-server-2005 - 在 T-SQL2005 中处理 10 0's of 1,000,000' 行

sql - 从包含 : For each row in a different table call a table returning function 的表中选择

sql-server - 区分大小写的字符串比较

sql - 在数据库级别创建用户

sql - 在 Postgres 中使用 NOT IN 子句时的混淆

sql-server - SQL查询快速选择百万条记录

java - 哪种方法更新数据库更好?

mysql - 编写 rake 检查模型和数据库,然后更新另一个模型

sql - 唯一约束的命名约定