是否可以在不使用 SQL 中的子查询的情况下根据另一列选择一列?

问题描述

我在 Postgresql 的 TimescaleDB 中工作。我有下表:

| id |      timestamp      |
----------------------------
| 1  | 2021-07-12 01:04:58 |
| 2  | 2021-07-12 02:12:03 |
| 3  | 2021-07-12 04:44:11 |
| 4  | 2021-07-12 05:08:31 |

我可以在一个查询中选择一小时桶中的时间,时间戳为timestamp_start,时间戳加一小时为timestamp_end,在一个查询中(意味着没有子查询)?

这就是我要找的结果:

|   timestamp_start   |    timestamp_end    |
---------------------------------------------
| 2021-07-12 01:00:00 | 2021-07-12 02:00:00 |
| 2021-07-12 02:00:00 | 2021-07-12 03:00:00 |
| 2021-07-12 03:00:00 | 2021-07-12 04:00:00 |
| 2021-07-12 04:00:00 | 2021-07-12 05:00:00 |
| 2021-07-12 05:00:00 | 2021-07-12 06:00:00 |

解决方法

使用date_trunc,例如

SELECT 
  date_trunc('hour',tm) AS timstamp_start,date_trunc('hour',tm) + interval '1 hour' AS timstamp_end
FROM t;

   timstamp_start    |    timstamp_end     
---------------------+---------------------
 2021-07-12 01:00:00 | 2021-07-12 02:00:00
 2021-07-12 02:00:00 | 2021-07-12 03:00:00
 2021-07-12 04:00:00 | 2021-07-12 05:00:00
 2021-07-12 05:00:00 | 2021-07-12 06:00:00
(4 rows)

演示:db<>fiddle

,

它有效,您可以声明与date_trunc相同:

tsdb=> select time_bucket('1 hour',time) as start,time_bucket('1 hour',time) + interval '1 hour' as end_date from conditions limit 1;
┌────────────────────────┬────────────────────────┐
│         start          │        end_date        │
├────────────────────────┼────────────────────────┤
│ 2010-01-06 22:00:00+00 │ 2010-01-06 23:00:00+00 │
└────────────────────────┴────────────────────────┘