SQL объединяет строку идентификатора дубликата в уникальную строку с дополнительным столбцом - PullRequest
0 голосов
/ 24 мая 2018

У меня болит голова, пытаясь заставить этот простой запрос работать в SQL на очень большой базе данных, может быть, некоторые из вас могли бы помочь?

ID|R1 |R2
1 | a | b
1 | c | d
2 | a | b
2 | c | d

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

ID|R1 |R2 |R3 |R4
1 | a | b | c | d
2 | a | b | c | d

Спасибо за любую помощь!

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Это сложно, потому что у вас недостаточно идентификаторов в вашей таблице.Одним из методов является использование переменных, добавление порядкового номера и агрегирование:

select id,
       max(case when rn = 1 then r1 end) as r1,
       max(case when rn = 1 then r2 end) as r2,
       max(case when rn = 2 then r1 end) as r3,
       max(case when rn = 2 then r2 end) as r4
from (select t.*,
             (@rn := if(@i = id, @rn + 1,
                        if(@i := id, 1, 1)
                       )
             ) as rn
      from (select t.*
            from t
            order by t.id
           ) t cross join
           (select @rn := 0, @i := -1) params
     ) t
group by id;
0 голосов
/ 24 мая 2018

Этот ответ является небольшим обновлением до ответа @TimBiegeleisen.

если таблица большая, вам также необходимо использовать

SET SESSION group_concat_max_len = @@max_allowed_packet;

. Этот запрос преобразует разделенные запятыми значения из функции GROUP_CONCAT в столбцы с помощью вложенных функций SUBSTRING_INDEX.

Запрос

SELECT 
   ID
 , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 1), ',', -1) AS r1
 , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 2), ',', -1) AS r2
 , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 3), ',', -1) AS r3
 , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 4), ',', -1) AS r4
FROM (

  SELECT
      ID, GROUP_CONCAT(val ORDER BY val) val
  FROM
  (
      SELECT ID, R1 AS val FROM yourTable
      UNION ALL
      SELECT ID, R2 FROM yourTable
  ) t
  GROUP BY ID
) x

см. Демонстрацию http://rextester.com/SDF72100

0 голосов
/ 24 мая 2018

Я собираюсь предложить запрос, который будет иметь почти то же поведение, что и вы, плюс он будет довольно простым:

SELECT
    ID, GROUP_CONCAT(val ORDER BY val) val
FROM
(
    SELECT ID, R1 AS val FROM yourTable
    UNION ALL
    SELECT ID, R2 FROM yourTable
) t
GROUP BY ID;

Демо

Такой подход желателен по нескольким причинам.Во-первых, оно устойчиво в отношении любого произвольного числа «столбцов», которое может иметь данный ID.Во-вторых, это дает нам возможность упорядочивать каждую строку значений любым удобным для нас способом.Наконец, его будет гораздо проще поддерживать, чем точный ответ с использованием переменных сеанса для имитации таких вещей, как номер строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...