sql - 如何计算每月间隔平均值和按月分组

标签 sql postgresql group-by

我正在使用 Postgres。

我有以下查询,它计算每月每一天的平均时间间隔。好吧,至少在我有可用数据的每一天:

SELECT 
  date_part('year'::text, c.date) AS yyyy,
  to_char(c.date, 'MM'::text) AS monthnumber,
  to_char(c.date, 'TMMonth'::text) AS monthname,
  c.date,
  l.name AS lineName,
  avg(COALESCE(c.observed_arrival_time,  v.arrival_time) - v.arrival_time) AS time_difference


FROM Counter c
  JOIN vehicule_journey_at_stop v ON v.id = c.vj_at_stop_id
  JOIN vehicule_journey vv ON vv.id = v.vehicule_journey_id
  JOIN route_analyse r ON r.id = vv.route_id
  JOIN line l ON l.id = r.line_id
  JOIN pt_network n ON n.id = l.network_id

WHERE 
  date_part('year',c.date) = 2014
  AND c.name = 'montée'

GROUP BY 1,2,3,4,5
ORDER BY 1,2

我得到的大部分是我想要的,结果是这样的:

...
2014;"07";"Juillet";"2014-07-12";"Ligne 01";"00:04:16.0685"
2014;"07";"Juillet";"2014-07-20";"Ligne 01";"00:04:56.509875"
2014;"07";"Juillet";"2014-07-23";"Ligne 02";"00:00:00"
2014;"07";"Juillet";"2014-07-24";"Ligne 03";"00:00:00"
...

重要的是最后位置的平均时间,计算每条“线”(例如“Ligne 01”或 Ligne“02”)。

事情是,我想将这些结果按月分组,每个月的每一天的平均间隔可用,即:

...
2014;"07";"Juillet";"Ligne 01";"00:04:36.5974375"
2014;"07";"Juillet";"Ligne 02";"00:00:00"
2014;"07";"Juillet";"Ligne 03";"00:00:00"
...

但我无法让它工作。 如果我从选择中删除 c.date(这会导致我的数据不是按月分组,而是按天分组,我明白了),我会得到错误的平均值。

最佳答案

使用实际字段名称(而不仅仅是数字)重写“group by”,然后从 select 中删除 c.date。这很容易。

关于sql - 如何计算每月间隔平均值和按月分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28090629/

相关文章:

mysql - 获取 mysql 表中按月和年分组的行总数

group-by - Pyspark groupby 然后在组内排序

mysql - 使用 Week No 在 MySql 中获取一周的第一天

mysql - 如何在已包含外键的表中添加数据

java - 为什么我从 Java 批量执行 PostgreSQL 上的存储过程时收到错误通知 "a result was not expected"?

sql - 使用 PostgreSQL 的交叉表查询中的计数和总和无效

node.js - 创建一个单元测试两个检查两个 psql 模式是否相同

MySQL LEFT Join 和 SUM 第二个表中的项目

sql - POSTGRESQL,无子查询 : subquery in FROM must have an alias

c# - 下载并执行 SQL 脚本——有哪些安全问题+解决方案?