У меня есть запрос sql, который возвращает это:
Обратите внимание, что здесь мы имеем:
LS_NoSerieA и Brn соответствует ROW_NUMBER из LS_NoSerieЯ хочу выполнить запрос поверх этого результата, чтобы получить это:
По сути, я хочу, чтобы все строки, где rn = 1 и DO_Tiers, получали совокупную строку соответствующего LS_NoSerie.
Что-то вроде:
SELECT cte.id, cte.LS_NoSerie, STRING_AGG(CONCAT(cte.DO_Tiers, ''), ','), cte.rn, cte.totalMatch
FROM (
SELECT * FROM my_table_name
) as cte
WHERE cte.rn = 1
GROUP BY cte.LS_NoSerie
Но это не работает, так как cte.id, cte.LS_NoSerie, cte.rn, cte.totalMatch не являются совокупностью и не являются частью GROUP BY.
Если вы хотите воспроизвести:
CREATE TABLE my_table_name
(
id INT,
LS_NoSerie VARCHAR(255),
DO_Tiers VARCHAR(255),
rn INT,
totalMatch INT
);
INSERT INTO my_table_name (id, LS_NoSerie, DO_Tiers, rn, totalMatch)
VALUES (1, N'A', N'I607', 1, 80);
INSERT INTO my_table_name (id, LS_NoSerie, DO_Tiers, rn, totalMatch)
VALUES (2, N'A', N'I3446', 2, 80);
INSERT INTO my_table_name (id, LS_NoSerie, DO_Tiers, rn, totalMatch)
VALUES (3, N'A', N'I3446', 3, 80);
INSERT INTO my_table_name (id, LS_NoSerie, DO_Tiers, rn, totalMatch)
VALUES (4, N'B', N'I3446', 1, 60);
INSERT INTO my_table_name (id, LS_NoSerie, DO_Tiers, rn, totalMatch)
VALUES (5, N'B', N'A4123', 2, 60);
INSERT INTO my_table_name (id, LS_NoSerie, DO_Tiers, rn, totalMatch)
VALUES (6, N'B', N'B7856', 3, 60);


SELECT
min( cte.Id) as Id
, cte.LS_NoSerie as LS_NoSerie
, STRING_AGG(CONCAT(cte.DO_Tiers, ''), ',') WITHIN GROUP (ORDER BY cte.Id) as DO_Tiers
,1 rn
,Max(cte.totalMatch) as totalMatch
FROM my_table_name cte
GROUP BY cte.LS_NoSerie
order by id
Вы можете использовать условную агрегацию, чтобы получить значения из строки rn=1 в каждой группе:
SELECT
MAX(CASE WHEN rn = 1 THEN id END) AS id,
ls_noserie,
STRING_AGG(CONCAT(do_tiers, ''), ',') AS tiers,
1 AS rn,
MAX(CASE WHEN rn = 1 THEN totalmatch END) AS totalmatch
FROM my_table_name
GROUP BY ls_noserie
ORDER BY ls_noserie;
Глядя на ваши образцы данных, вы должны получить простую агрегацию:
select
Min(Id),
LS_NoSerie,
String_Agg(DO_Tiers, ',') DO_tiers,
Min(rn) rn,
Min(totalMatch) totalMatch
from t
group by LS_NoSerie;