【问题标题】:SQL merge doublon ID row into unique row with more columnSQL将doublon ID行合并为具有更多列的唯一行
【发布时间】:2018-05-24 10:27:16
【问题描述】:

我很头疼,想在一个非常庞大的数据库上用 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

感谢您的帮助!

【问题讨论】:

  • 你要做的是PIVOT,到处搜索
  • 每个id 是否总是正好有两行?哪一行的值进入r3r4 是否重要?
  • 您需要在这里向我们展示更多数据。
  • image.noelshack.com/fichiers/2018/21/4/1527158027-capture.jpg 这是我的数据外观的屏幕。它恰好在行上有两个以上的 doublon ID。并且可能导致超过 5 列。

标签: mysql sql database select


【解决方案1】:

我将提供一个查询,它的行为与您想要的几乎相同,而且它相当简单:

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 可能具有的任意数量的“列”,它是稳健的。其次,它使我们可以选择以任何我们想要的方式对每一行值进行排序。最后,与使用会话变量来模拟行号等内容的精确答案相比,维护起来要容易得多。

【讨论】:

  • 如果表很大,你也需要使用SET SESSION group_concat_max_len = @@max_allowed_packet;
【解决方案2】:

这很棘手,因为您的表中没有足够的 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;

【讨论】:

    【解决方案3】:

    这个答案是对@TimBiegeleisen 答案的一点升级。

    如果表很大你也需要使用

    SET SESSION group_concat_max_len = @@max_allowed_packet;
    

    此查询将使用嵌套的SUBSTRING_INDEX 函数将GROUP_CONCAT 函数中的逗号分隔值转换为列。

    查询

    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

    【讨论】:

    • 聪明的+1 ...也许OP是从Java之类的东西调用它,实际的列会很有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2021-03-31
    相关资源
    最近更新 更多