You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PostgreSQL中将VARCHAR类型答案行数据按USER_ID转为多列视图

PostgreSQL实现用户答案行转列视图方案

方案1:通用CASE WHEN聚合实现(无需额外扩展)

思路:先给每个用户的答案生成序号,再按用户分组聚合,按序号提取对应答案作为列,适配你最多20条答案的需求。

CREATE VIEW user_answer_pivot AS
SELECT
  user_id,
  MAX(CASE WHEN rn = 1 THEN answer END) AS answer1,
  MAX(CASE WHEN rn = 2 THEN answer END) AS answer2,
  MAX(CASE WHEN rn = 3 THEN answer END) AS answer3,
  -- 按相同规则继续补充到rn=20即可
  MAX(CASE WHEN rn = 20 THEN answer END) AS answer20
FROM (
  SELECT
    user_id,
    answer,
    -- 如需按答题时间排序,请将ORDER BY answer替换为ORDER BY 你的答题时间字段
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY answer) AS rn
  FROM user_answers -- 替换为你的原表实际名称
) t
GROUP BY user_id
ORDER BY user_id;

方案2:使用crosstab函数简化实现(需启用tablefunc扩展)

如果要减少重复的CASE WHEN代码,可以用PostgreSQL内置的交叉表函数实现,首先启用扩展:

CREATE EXTENSION IF NOT EXISTS tablefunc;

再创建视图:

CREATE VIEW user_answer_pivot AS
SELECT *
FROM crosstab(
  'SELECT user_id, answer, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY answer) AS rn FROM user_answers ORDER BY 1,3',
  'SELECT generate_series(1,20)' -- 对应最多20个答案的序号范围
) AS ct (
  user_id INT,
  answer1 TEXT,
  answer2 TEXT,
  answer3 TEXT,
  -- 按相同规则继续补充到answer20即可
  answer20 TEXT
);

注意:视图要求列结构固定,如果后续单用户答案数量超过20需要手动补充列定义;如果需要完全动态的列输出,建议使用PL/pgSQL存储过程动态生成查询语句。

内容的提问来源于stack exchange,提问作者Sim_R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:54:00