【问题标题】:Multiple responses for same ID - Create additional column to retain both responses同一 ID 的多个响应 - 创建附加列以保留两个响应
【发布时间】:2020-10-20 00:38:21
【问题描述】:

我有一个数据集,其中包含来自同一个人/ID 的多个响应(ID 为单独的行,同一列中的响应)。我希望创建其他列(通过视图或创建/更新其他列)以将这些多个响应保留在一行中。我假设我需要自己加入表并为此使用另一个(顺序)ID?任何帮助将不胜感激(请参见下面的示例,对格式化表示歉意......)。

提前致谢!

当前数据:

ID      Column1
------------------------
P1      Response1 
P1      Response2 
P2      Response1 
P2      Response2 

所需数据:

ID      Column1a      Column1b
--------------------------------
P1      Response1     Response2
P2      Response1     Response2 

【问题讨论】:

  • (1) 您使用的是什么数据库? (2) 最大响应数是否始终为 2? (3) 响应是如何排序的?
  • (1) 老实说,我不知道哈哈。 MSSql 服务器? (2) 在这种情况下,是的。但是我将跨表执行此操作,并且不确定这些表的最大值是多少。 (3) 响应按完成日期排序。
  • 一般来说,在表中重复组是一个糟糕的数据库设计决策。不是第一范式的表会使查询更难编写,并人为地限制表中可以保存的数据。

标签: sql select duplicates pivot psql


【解决方案1】:

一个选项使用row_number() 和条件聚合。假设您希望响应按completion_date 排序,如 cmets 所示:

select
    id,
    max(case when rn = 1 then column1 end) column1a,
    max(case when rn = 2 then column1 end) column1b
from (
    select 
        t.*, 
        row_number() over(partition by id order by completion_date) rn
    from mytable t
) t
group by id

您可以使用更多条件 max()s 扩展 select 子句,以处理每个 id 的更多可能值。

【讨论】:

  • 超级好用!我打算使用 STUFF 连接所有响应,然后根据分隔符将它们解析出来。但是,这样效率更高。如果我在最终表格中需要更多列,我只需创建一个视图并加入表格本身?
  • @Ian:最好将列添加到selecŧgroup by 子句中。但我无法确定,因为您没有在问题中提供此信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多