在PostgreSQL中使用公共表表达式(CTE)构建表时,如何获取唯一字段?

在PostgreSQL中使用公共表表达式(CTE)构建表时,如何获取唯一字段?,postgresql,datetime,common-table-expression,generate-series,Postgresql,Datetime,Common Table Expression,Generate Series,我试图生成一系列时间戳,使用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

我试图生成一系列时间戳,使用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;
然后,正如我所预期的那样,我试图在上面查看的数据是连续的:

    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

如何从候选人处获取数据。生成系列以候选表格的形式显示。开始预订?

猜测-您是否在尝试:

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”的列。我可以重命名它吗?eddited包含通缉犯别名