SQL将doublelon ID行合并为具有更多列的唯一行

时间:2018-05-24 10:27:16

标签: mysql sql database select

我有一个头脑试图让这个简单的请求在一个非常庞大的数据库中运行SQL,也许你们中的一些人可以提供帮助吗?

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

我想做一个sql select查询来代替:

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我将提供一个与您想要的行为几乎相同的查询,此外它将非常简单:

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;

Demo

由于几个原因,这种方法是可取的。首先,对于给定ID可能具有的任意数量的“列”,它是健壮的。其次,它为我们提供了以任何我们想要的方式对每一行值进行排序的选项。最后,使用会话变量来模拟诸如行号之类的事情,维护比使用确切答案要容易得多。

答案 1 :(得分:1)

这很棘手,因为您的表中没有足够的ID。一种方法是使用变量,添加序列号和聚合:

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;

答案 2 :(得分:1)

这个答案是对@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