Группа STRING_AGG по нескольким столбцам

У меня есть запрос sql, который возвращает это:

идентификатор LS_NoSerie DO_Tiers р-н тоталматч 1 А I607 1 80 2 А I3446 2 80 3 А I3446 3 80 4 Б I3446 1 60 5 Б А4123 2 60 6 Б B7856 3 60

Обратите внимание, что здесь мы имеем:

  • 2 разных LS_NoSerieA и B
  • столбец rn соответствует ROW_NUMBER из LS_NoSerie

Я хочу выполнить запрос поверх этого результата, чтобы получить это:

идентификатор LS_NoSerie DO_Tiers р-н тоталматч 1 А И607, И3446, И3446 1 80 4 Б И3446, А4123, Б7856 1 60

По сути, я хочу, чтобы все строки, где 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);
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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;

Демо: https://dbfiddle.uk/-XMD6EDg

Глядя на ваши образцы данных, вы должны получить простую агрегацию:

select
  Min(Id),
  LS_NoSerie, 
  String_Agg(DO_Tiers, ',') DO_tiers, 
  Min(rn) rn,
  Min(totalMatch) totalMatch
from t
group by LS_NoSerie;

Другие вопросы по теме