Создайте новые столбцы для повторяющихся значений строк на основе идентификатора столбца дубликата в SQL - PullRequest
0 голосов
/ 18 сентября 2019

У меня есть таблица с 2 столбцами, первый столбец называется ID, а второй называется TRACKING.В столбце ID есть дубликаты, я хочу взять все эти дубликаты и объединить их в одну строку, где каждое значение из TRACKING из дублирующейся строки помещается в новый столбец в той же строке, и у меня больше нет дубликатов..

Я попробовал несколько предложенных вещей, где все значения будут объединены в один столбец, но я хочу, чтобы эти значения TRACKING для дубликатов ID были в отдельных столбцах.Код ниже не сделал то, что я хотел.

SELECT ID, TRACKING = 
    STUFF((SELECT DISTINCT ', ' + TRACKING
       FROM #t b 
       WHERE b.ID = a.ID 
      FOR XML PATH('')), 1, 2, '')
FROM #t a
GROUP BY ID

Я собираюсь взять это:

| ID | TRACKING |
-----------------
| 5  | 13t3in3i |
| 5  | g13g13gg |
| 3  | egqegqgq |
| 2  | 14y2y24y |
| 2  | 42yy44yy |
| 5  | 8i535i35 |

И превратить это в это:

| ID |  TRACKING  | TRACKING1 | TRACKING2 |
-----------------
| 5  |  13t3in3i  | g13g13gg  | 8i535i35  |
| 3  |  egqegqgq  |           |           |
| 2  |  14y2y24y  | 42yy44yy  |           |

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

На (относительно) болезненном способе сделать это в MySQL является использование коррелированных подзапросов:

select i.id,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 0
       ) as tracking_1,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 1
       ) as tracking_2,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 2
       ) as tracking_3
from (select distinct id from t
     ) i;

Каким бы плохим это ни выглядело, он, вероятно, будет иметь удивительно приличную производительность с индексом на (id, tracking).

Кстати, ваш оригинальный код с stuff() поместит все в один столбец:

select id, group_concat(tracking)
from t
group by id;
0 голосов
/ 18 сентября 2019

Используйте ROW_NUMBER() (доступно в MySQL 8.0) для обнаружения дубликатов и условного агрегирования для распределения по столбцам:

SELECT
    id,
    MAX(CASE WHEN rn = 1 THEN tracking END) tracking1,
    MAX(CASE WHEN rn = 2 THEN tracking END) tracking2,
    MAX(CASE WHEN rn = 3 THEN tracking END) tracking3
FROM (
    SELECT id, tracking, ROW_NUMBER() OVER(PARTITION BY id ORDER BY tracking) rn
    FROM mytable
) x
GROUP BY id
ORDER BY id DESC

Приведенный выше запрос обрабатывает до 3 значений отслеживания для данного id,Если вам нужно обработать больше, вам просто нужно добавить больше MAX(CASE ... END) выражений к предложению SELECT.

Эта демонстрация на DB Fiddle сваш пример данных дает:

id | tracking1 | tracking2 | tracking3
-: | :-------- | :-------- | :--------
 5 | 13t3in3i  | 8i535i35  | g13g13gg 
 3 | egqegqgq  | <em>null</em>      | <em>null</em>     
 2 | 14y2y24y  | 42yy44yy  | <em>null</em>     
...