yang_z_1 2022-01-24 16:30 采纳率: 0%
浏览 29

postgres 数据库 中想按照时间进行行转列

问题遇到的现象和发生背景

数据库 :postgresql 版本11
现在需要对数据进行处理

我需求的 样式

名字2022-1-12022-1-22022-1-32022-1-42022-1-52022-1-62022-1-72022-1-82022-1-9------
张三------
李四------
王五------
------------.------.------------------.------------------------------

我现在的数据

名字时间
张三2022-1-11
李四2022-1-12
王五2022-1-11
张三2022-1-23
李四2022-1-24
李四2022-1-31
------------------

由于需要按时间进行行转列,时间是最近三个月。该如何实现?

我的解答思路和尝试过的方法

我试过case when ,和pg 的crosstab 函数 ,但是都需要把列名写出来,有没有什么简单的方式,主要不需要写列名,毕竟三个月实在是太多了

我想要达到的结果
  • 写回答

2条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-01-24 18:40
    关注

    首先,数字开头的字符串是不能作为字段名的,而且“-”这个符号也不能包含在字段名内,因为可能会被认为是减号,因此目前无法实现你问题中要求的这个效果。
    然后,假设你字段名改一下,比如 d20220101,d20220102 ...这样,其实可以先用sql拼接的方式先把正确的sql拼接出来再去执行

    ---测试数据
    CREATE TABLE exams2 (
    name varchar(15),
    exam date,
    value int
    );
    
    insert into exams2 (name,exam,value) values ('Bob','2021-01-01',70);
    insert into exams2 (name,exam,value) values ('Bob','2021-01-02',77);
    insert into exams2 (name,exam,value) values ('Bob','2021-01-03',71);
    insert into exams2 (name,exam,value) values ('Bob','2021-01-04',70);
    
    insert into exams2 (name,exam,value) values ('Sue','2021-01-01',89);
    insert into exams2 (name,exam,value) values ('Sue','2021-01-02',87);
    insert into exams2 (name,exam,value) values ('Sue','2021-01-03',88);
    insert into exams2 (name,exam,value) values ('Sue','2021-01-04',89);
    
    ---拼接sql
    select 'SELECT * FROM crosstab(''select name ,exam , value  from exams2 order by 1,2'') as ct (name varchar(20),'
    || string_agg(e||' int',',' order by e) ||');' from (
    select   distinct 'd'||to_char(exam,'yyyymmdd') e from exams2 ) t;
    
    ---执行上面的查询后,可以得到下面这个sql的字符串,复制出来再去执行即可
    SELECT * FROM crosstab('select name ,exam , value  from exams2 order by 1,2') as ct (name varchar(20),d20210101 int,d20210102 int,d20210103 int,d20210104 int);
    

    另外,官方文档中提供了一个crosstabN的用法,除了N为2/3/4以外,更多的列需要你自行定义一个type,在type中去定义有哪些字段以及字段类型,这样在查询的时候就不用去传那一串东西了
    http://www.postgres.cn/docs/13/tablefunc.html

    评论
  • eppen 2022-05-09 21:40
    关注

    👍

    评论

报告相同问题?

问题事件

  • 创建了问题 1月24日

悬赏问题

  • ¥15 matlab有svec这个函数吗?
  • ¥15 无法调用VideoWriter_fourcc
  • ¥15 VB6.0无法加载网页验证码图片到picturebox中,求解。
  • ¥15 C#和GDAL对栅格处理
  • ¥15 我现在有一些关于提升机故障的专有文本数据,量也不多,我在label studio上进行了关系和实体的标注,完成了知识图谱的构造,那么我使用生成式模型的话,我能做哪些工作来写我的论文?
  • ¥15 电脑连不上无线网络如下诊断反馈应该如何操作
  • ¥15 telegram api 使用forward_messages方法转发消息时,目标群组里面会出现此消息来源,如何隐藏?
  • ¥15 关于#tensorflow#的问题:有没有什么方法可以让机器自己学会像素风格的图片
  • ¥15 Oracle触发器字段变化时插入指定值
  • ¥15 docker无法进入容器内部