【问题标题】:How can I get unique fields when building a table using Common Table Expression (CTE) in PostgreSQL?在 PostgreSQL 中使用公用表表达式 (CTE) 构建表时如何获取唯一字段?
【发布时间】:2018-02-28 05:54:09
【问题描述】:

我正在尝试使用 PostGreSQL 生成一系列时间戳,计算每个时间戳的星期几并仅选择周一至周六的时间戳。

这是我目前的尝试:

WITH
candidates AS (SELECT * FROM generate_series(
  date_trunc('hour', CURRENT_TIMESTAMP - INTERVAL '2 hours'),
  date_trunc('hour', CURRENT_TIMESTAMP - INTERVAL '2 hours')+INTERVAL '1 week',
  INTERVAL '1 hour')),
candidows AS (SELECT EXTRACT(DOW FROM generate_series) FROM candidates),
candidatable AS (SELECT b.date_part AS dow, a.generate_series as start_booking FROM candidates a, candidows b)
SELECT * FROM candidatable WHERE dow != 0;

返回的视图包含一个行为如我预期的 dow 列,但 start_booking 列只包含重复的相同值:

 dow |     start_booking
-----+------------------------
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   2 | 2017-09-19 11:00:00+01
   3 | 2017-09-19 11:00:00+01
   3 | 2017-09-19 11:00:00+01
   3 | 2017-09-19 11:00:00+01

如果我将最后一个 SELECT 语句替换为:

SELECT * FROM candidates;

那么我试图在上面的 start_booking 中查看的数据是连续的,正如我所料:

    generate_series
------------------------
 2017-09-19 11:00:00+01
 2017-09-19 12:00:00+01
 2017-09-19 13:00:00+01
 2017-09-19 14:00:00+01
 2017-09-19 15:00:00+01
 2017-09-19 16:00:00+01

如何从 Candidate.generate_series 中获取数据以显示为 candidatables.start_booking?

【问题讨论】:

    标签: postgresql datetime common-table-expression generate-series


    【解决方案1】:

    一个疯狂的猜测 - 你想:

    WITH
    candidates AS (SELECT generate_series start_booking, EXTRACT(DOW FROM generate_series) dow FROM generate_series(
      date_trunc('hour', CURRENT_TIMESTAMP - INTERVAL '2 hours'),
      date_trunc('hour', CURRENT_TIMESTAMP - INTERVAL '2 hours')+INTERVAL '1 week',
      INTERVAL '1 hour'))
    SELECT * FROM candidates WHERE dow != 0;
    

    ?..

    【讨论】:

    • 这是更好的行为,但我真的不希望结果包含名为“generate_series”的列。我可以以某种方式重命名吗?
    • 编辑以包含想要的别名
    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多