我正在尝试编写一个脚本,它返回一个月列表,其中包含该月的天数。它引用了这个表

 CREATE TABLE generic.time_series_only (measurementdatetime TIMESTAMP WITHOUT TIME ZONE NOT NULL)

这只是一个按时间顺序排列的时间序列(在将不同位置有间隙的数据表连接在一起时非常有用,但是您想要一个完整的时间序列作为您的输出,也许有一种更聪明的方法可以做到这一点,但我还没有找到它)。
SELECT date_part('year'::text, time_series_only.measurementdatetime) AS
    measyear,
         date_part('month'::text, time_series_only.measurementdatetime) AS
           measmonth,
         date_trunc('month'::text, time_series_only.measurementdatetime) +
           '1 mon'::interval - date_trunc('month'::text,
           time_series_only.measurementdatetime) AS days_in_month
  FROM generic.time_series_only
  GROUP BY date_part('year'::text, time_series_only.measurementdatetime),
           date_part('month'::text, time_series_only.measurementdatetime)
  ORDER BY date_part('year'::text, time_series_only.measurementdatetime),
           date_part('month'::text, time_series_only.measurementdatetime);

但我有个错误:
  ERROR:  column "time_series_only.measurementdatetime" must appear in the GROUP BY clause or be used in an aggregate function

我不能把这个列放在GROUPBY子句中,因为这样我就可以得到仅时间序列表中每个条目的结果,而且我也不能用聚合函数得到相同的结果?欢迎提出任何建议:-)

最佳答案

使用一对(年、月)。您可以用函数distinct on替换time_series_only表,例如:

select distinct on (date_part('year', d), date_part('month', d))
    date_part('year', d) as year,
    date_part('month', d) as month,
    date_part('day', d) as days_in_month
from
    generate_series('2016-01-01'::date, '2016-12-31'::date, '1d'::interval) d
order by 1, 2, 3 desc;

 year | month | days_in_month
------+-------+---------------
 2016 |     1 |            31
 2016 |     2 |            29
 2016 |     3 |            31
 2016 |     4 |            30
 2016 |     5 |            31
 2016 |     6 |            30
 2016 |     7 |            31
 2016 |     8 |            31
 2016 |     9 |            30
 2016 |    10 |            31
 2016 |    11 |            30
 2016 |    12 |            31
(12 rows)

关于sql - PostgreSQL创建每月的天数表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42306566/

10-12 22:34