【问题标题】:How to do the join two tables in postgresql on the datetime columns and that appear all registers of datetime in one only column?如何在 postgresql 中的 datetime 列上连接两个表,并将 datetime 的所有寄存器显示在一个唯一的列中?
【发布时间】:2020-02-20 03:43:58
【问题描述】:

我有两张桌子:

TABLE_MACHINE_1

datetime,            sensor_1
2017-10-01 21:00:00, 1.18047
2017-10-01 21:15:00, 1.18023
2017-10-01 21:30:00, 1.18059
2017-10-01 21:45:00, 1.18067
2017-10-01 22:00:00, 1.18056
2017-10-01 22:15:00, 1.18147
2017-10-01 22:30:00, 1.18104
2017-10-01 22:45:00, 1.18111
2017-10-01 23:00:00, 1.18103
2017-10-01 23:15:00, 1.18072
2017-10-01 23:30:00, 1.18083
2017-10-01 23:45:00, 1.18079
2017-10-02 00:00:00, 1.17996
2017-10-02 00:15:00, 1.17987
2017-10-02 00:30:00, 1.17968
2017-10-02 00:45:00, 1.17893
2017-10-02 01:00:00, 1.17852
2017-10-02 01:15:00, 1.17833

TABLE_MACHINE_2

datetime,            sensor_2
2017-10-01 21:45:00, 112.1
2017-10-01 22:00:00, 133.2
2017-10-01 22:15:00, 143.5
2017-10-01 22:30:00, 154.9
2017-10-01 22:45:00, 166.1
2017-10-01 23:30:00, 123.1
2017-10-01 23:45:00, 134.1
2017-10-02 00:00:00, 188.3
2017-10-02 01:00:00, 192.9
2017-10-02 01:15:00, 105.3
2017-10-02 01:30:00, 172.9
2017-10-02 01:45:00, 145.3
2017-10-02 02:00:00, 174.9
2017-10-02 02:15:00, 155.3

我预计结果如何:

期待加入

datetime,            sensor_1  sensor_2
2017-10-01 21:00:00, 1.18047,  NULL
2017-10-01 21:15:00, 1.18023,  NULL
2017-10-01 21:30:00, 1.18059,  NULL
2017-10-01 21:45:00, 1.18067,  112.1
2017-10-01 22:00:00, 1.18056,  133.2
2017-10-01 22:15:00, 1.18147,  143.5
2017-10-01 22:30:00, 1.18104,  154.9
2017-10-01 22:45:00, 1.18111,  166.1
2017-10-01 23:00:00, 1.18103,  NULL
2017-10-01 23:15:00, 1.18072,  NULL
2017-10-01 23:30:00, 1.18083,  123.1
2017-10-01 23:45:00, 1.18079,  134.1
2017-10-02 00:00:00, 1.17996,  188.3
2017-10-02 00:15:00, 1.17987,  105.3
2017-10-02 00:30:00, 1.17968,  NULL
2017-10-02 00:45:00, 1.17893,  NULL
2017-10-02 01:00:00, 1.17852,  NULL
2017-10-02 01:15:00, 1.17833,  NULL
2017-10-02 01:30:00, NULL   ,  172.9
2017-10-02 01:45:00, NULL   ,  145.3
2017-10-02 02:00:00, NULL   ,  174.9
2017-10-02 02:15:00, NULL   ,  155.3

但是如果我做 FULL OUTER JOIN 得到:

日期时间从 TABLE_MACHINE_1 完全外部连接 TABLE_MACHINE_2

datetime,            sensor_1, datetime,            sensor_2
2017-10-01 21:00:00, 1.18047,  NULL,                NULL  
2017-10-01 21:15:00, 1.18023,  NULL,                NULL 
2017-10-01 21:30:00, 1.18059,  NULL,                NULL 
2017-10-01 21:45:00, 1.18067,  2017-10-01 21:45:00, 112.1
2017-10-01 22:00:00, 1.18056,  2017-10-01 22:00:00, 133.2
2017-10-01 22:15:00, 1.18147,  2017-10-01 22:15:00, 143.5
2017-10-01 22:30:00, 1.18104,  2017-10-01 22:30:00, 154.9
2017-10-01 22:45:00, 1.18111,  2017-10-01 22:45:00, 166.1
2017-10-01 23:00:00, 1.18103,  NULL,                NULL 
2017-10-01 23:15:00, 1.18072,  NULL,                NULL 
2017-10-01 23:30:00, 1.18083,  2017-10-01 23:30:00, 123.1
2017-10-01 23:45:00, 1.18079,  2017-10-01 23:45:00, 134.1
2017-10-02 00:00:00, 1.17996,  2017-10-02 00:00:00, 188.3
2017-10-02 00:15:00, 1.17987,  NULL,                NULL 
2017-10-02 00:30:00, 1.17968,  NULL,                NULL 
2017-10-02 00:45:00, 1.17893,  NULL,                NULL 
2017-10-02 01:00:00, 1.17852,  2017-10-02 01:00:00, 192.9
2017-10-02 01:15:00, 1.17833,  2017-10-02 01:15:00, 105.3
NULL,                NULL,     2017-10-02 01:30:00, 172.9 
NULL,                NULL,     2017-10-02 01:45:00, 145.3
NULL,                NULL,     2017-10-02 02:00:00, 174.9 
NULL,                NULL,     2017-10-02 02:15:00, 155.3

我需要在 postgresql 中的一个查询中解决它,我尝试使用完全外连接子句不成功。

我考虑过以下解决方案,但我无法实现它,因为当我传递变量“generate_series”时出错:

  1. 创建一个变量来存储每个表的最大天数。

      datetime_end := to_char(now()::date,'YYY-MM-DD');
    
  2. 将变量传递给以下查询:

      SELECT generate_series(
          timestamp without time zone '2017-10-01',
          timestamp without time zone datetime_end,
          '15 minute');
    
    1. 对两个表执行 LEFT JOIN 之前的查询。

提前致谢。

【问题讨论】:

    标签: sql postgresql date datetime join


    【解决方案1】:

    你想要full outer join coalesce():

    select 
        coalesce(t1.datetime, t2.datetime) datetime,
        t1.sensor_1,
        t2.sensor_2
    from table_machine_1 t1
    full outer join table_machine_2 t2 
        on t1.datetime = t2.datetime
    

    Demo on DB Fiddle

    | datetime            | sensor_1 | sensor_2 |
    | ------------------- | -------- | -------- |
    | 2017-10-01 21:00:00 | 1.18047  |          |
    | 2017-10-01 21:15:00 | 1.18023  |          |
    | 2017-10-01 21:30:00 | 1.18059  |          |
    | 2017-10-01 21:45:00 | 1.18067  | 112.1    |
    | 2017-10-01 22:00:00 | 1.18056  | 133.2    |
    | 2017-10-01 22:15:00 | 1.18147  | 143.5    |
    | 2017-10-01 22:30:00 | 1.18104  | 154.9    |
    | 2017-10-01 22:45:00 | 1.18111  | 166.1    |
    | 2017-10-01 23:00:00 | 1.18103  |          |
    | 2017-10-01 23:15:00 | 1.18072  |          |
    | 2017-10-01 23:30:00 | 1.18083  | 123.1    |
    | 2017-10-01 23:45:00 | 1.18079  | 134.1    |
    | 2017-10-02 00:00:00 | 1.17996  | 188.3    |
    | 2017-10-02 00:15:00 | 1.17987  |          |
    | 2017-10-02 00:30:00 | 1.17968  |          |
    | 2017-10-02 00:45:00 | 1.17893  |          |
    | 2017-10-02 01:00:00 | 1.17852  | 192.9    |
    | 2017-10-02 01:15:00 | 1.17833  | 105.3    |
    | 2017-10-02 02:00:00 |          | 174.9    |
    | 2017-10-02 01:30:00 |          | 172.9    |
    | 2017-10-02 01:45:00 |          | 145.3    |
    | 2017-10-02 02:15:00 |          | 155.3    |
    

    【讨论】:

      【解决方案2】:

      日期时间从 TABLE_MACHINE_1 完全外部连接 TABLE_MACHINE_2

      那不是有效的 SQL。

      如果您使用USING 而不是ON 进行连接,那么它将自动合并列。

      select 
          datetime,
          t1.sensor_1,
          t2.sensor_2
      from table_machine_1 t1
      full outer join table_machine_2 t2 
          USING (datetime)
      

      【讨论】:

      • @GMB 你有吗?没有错误。 USING 合并连接列,在结果中创建一个明确的列。
      • 我刚刚做了,我看你是对的! +1 这个答案让我学到了一些东西。删除我之前的评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多