Учитывая, что вы не продемонстрировали свои усилия или не подтвердили используемую вами версию, я предположил, что у вас установлена последняя («самая лучшая») версия SQL Server, что означает, что у вас есть доступ к STRING_AGG
.
Это не дает группировку в одном и том же порядке, но я также хочу сказать, что это не имеет значения, и группировка просто произвольна.Это дает вам следующее:
WITH VTE AS(
SELECT *
FROM (VALUES('a',1),
('a',2),
('a',3),
('b',1),
('b',2),
('c',3),
('c',2),
('c',1),
('d',1),
('d',3),
('e',1),
('e',2),
('f',1),
('g',2),
('h',3)) V(productid,customerid)),
Groups AS(
SELECT productid,
STRING_AGG(customerid,',') WITHIN GROUP (ORDER BY customerid) AS CustomerIDs
FROM VTE
GROUP BY productid),
Rankings AS(
SELECT productid,
CustomerIDs,
DENSE_RANK() OVER (ORDER BY CustomerIDs ASC) AS Grouping
FROM Groups)
SELECT V.productid,
V.customerid,
R.Grouping AS customergroupid
FROM VTE V
JOIN Rankings R ON V.productid = R.productid
ORDER BY V.productid,
V.customerid;
db <> fiddle .
Если вы не используете SQL Server 2017, я предлагаю поискать FOR XML PATH
метод агрегации строк.