Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当月的日平均值(每月需要天数)_Sql_Postgresql_Date_Aggregate Functions_Date Arithmetic - Fatal编程技术网

Sql 当月的日平均值(每月需要天数)

Sql 当月的日平均值(每月需要天数),sql,postgresql,date,aggregate-functions,date-arithmetic,Sql,Postgresql,Date,Aggregate Functions,Date Arithmetic,我有一张桌子如下: CREATE TABLE counts ( T TIMESTAMP NOT NULL, C INTEGER NOT NULL ); 我从中创建以下视图: CREATE VIEW micounts AS SELECT DATE_TRUNC('minute',t) AS t,SUM(c) AS c FROM counts GROUP BY 1; CREATE VIEW hrcounts AS SELECT DATE_TRUNC('hour',t) AS t,

我有一张桌子如下:

CREATE TABLE counts
(
    T TIMESTAMP NOT NULL,
    C INTEGER NOT NULL
);
我从中创建以下视图:

CREATE VIEW micounts AS 
SELECT DATE_TRUNC('minute',t) AS t,SUM(c) AS c FROM counts GROUP BY 1;

CREATE VIEW hrcounts AS
SELECT DATE_TRUNC('hour',t) AS t,SUM(c) AS c,SUM(c)/60 AS a
FROM micounts GROUP BY 1;

CREATE VIEW dycounts AS
SELECT DATE_TRUNC('day',t) AS t,SUM(c) AS c,SUM(c)/24 AS a
FROM hrcounts GROUP BY 1;
现在的问题是,当我想要创建每月计数,以知道每日总和除以什么,得到平均列a,即特定月份的天数时

我知道要获得PostgreSQL中的天数,您可以执行以下操作:

SELECT DATE_PART('days',DATE_TRUNC('month',now())+'1 MONTH'::INTERVAL-DATE_TRUNC('month',now()))
但是我不能使用
now()
,我必须让它知道分组完成的月份。有什么建议,比如应该更换什么???在这一观点中:

CREATE VIEW mocounts AS
SELECT DATE_TRUNC('month',t) AS t,SUM(c) AS c,SUM(c)/(???) AS a
FROM dycounts
GROUP BY 1;

短一点、快一点,您就可以得到天数,而不是
时间间隔

SELECT EXTRACT(day FROM date_trunc('month', now()) + interval '1 month'
                                                   - interval '1 day')
可以在一个
间隔内组合多个单元。因此,我们可以使用
“1周一-1天”

SELECT EXTRACT(day FROM date_trunc('month', now()) + interval '1 mon - 1 day')
mon
month
months
对月份单位的作用相同。)

将每日总天数除以当月天数(原始问题):

要将月总数除以当月天数(更新问题):

如果要使用单个查询级别,则必须重复
GROUP BY
表达式

或者使用子查询:

SELECT *, c / EXTRACT(day FROM t + interval '1 mon - 1 day') AS a
FROM  (
   SELECT date_trunc('month', t)::date AS t, SUM(c) AS c
   FROM   dycounts
   GROUP  BY 1
   ) sub;

非常感谢您花时间回答。我原来的问题(mocount中的date_trunc是day而不是month)有一个输入错误,我相信这对你的答案有重大影响。t::date as day与date_trunc(“day”…)相同,因此我可以理解你为什么提出它,但在我更正了问题后,你的答案并不完全正确,我也无法通过修补我显然有限的知识来获得你的答案。您介意重新评估您的答案吗?创建视图mocounts作为选择日期(“月”,t)::日期作为t,总和(c)作为c,总和(c)/(摘录(从(日期(“月”,日期(“月”),日期::日期+间隔“1个月”)::日期-1))作为从动态计数组中按1@瓦斯拉普:没错。不过,我发现了另一个改进。考虑更新答案。
SELECT DATE_TRUNC('month', t)::date AS t
      ,SUM(c) AS c
      ,SUM(c) / EXTRACT(day FROM date_trunc('month', t)::date
                               + interval '1 mon - 1 day') AS a
FROM   dycounts
GROUP  BY 1;
SELECT *, c / EXTRACT(day FROM t + interval '1 mon - 1 day') AS a
FROM  (
   SELECT date_trunc('month', t)::date AS t, SUM(c) AS c
   FROM   dycounts
   GROUP  BY 1
   ) sub;