PostgreSQL:对年龄的两个值求和
PostgreSQL: SUM two values from age
我正在尝试对使用 PostgreSQL 中的 AGE 函数计算的两个值求和。 AGE 应该是计算得出的与该列中不同 (session) 值相关联的 MAX 和 MIN 值(Session 值是不同的)。 AGE 函数应该从 (date_time) 列中提取分钟数,然后从 (date_time) 列中提取小时数,然后将该值乘以 60,然后将这些值相加得到总分钟数session.
我能够通过
成功做到这一点
SELECT
session, organization, username,
((date_part('hour',age(MAX(date_time), Min(date_time)))*60) + date_part('minute',age(MAX(date_time),
Min(date_time)))) AS Duration
FROM
analysis.user_activity
enter code here
但是,现在我正在尝试能够根据 GROUP(组织)持续时间的总和来按该函数 returns 的数字的总和进行排序,只需执行 ORDER BY(持续时间)按上面计算的最大单个值排序,而不是按组的整个聚合。这就是问题的开始。首先,我尝试如下:
SELECT
SUM(
(date_part('hour',age(MAX(date_time), Min(date_time)))*60),
date_part('minute',age(MAX(date_time), Min(date_time)))) as SumofDuration
FROM
analysis.user_activity
我得到这个错误:错误:函数总和(双精度,双精度)不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。位置:137。我也收到了关于你不能嵌套聚合函数的错误,所以我把我的 SELECT 分成多个步骤,现在我有如下。
SELECT
session, organization, username,
SUM((SELECT date_part('hour',age(MAX(date_time), Min(date_time)))::integer*60
FROM analysis.user_activity)
,
(SELECT date_part('minute',age(MAX(date_time), Min(date_time)))::integer
FROM analysis.user_activity))
来自
analysis.user_activity
但是,这也给我错误 错误:函数总和(整数,整数)不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。位置:169。我也尝试过使用 numeric 类型。根据文档 https://www.postgresql.org/docs/8.2/functions-aggregate.html,这应该能够对我的函数生成的三种数据类型中的任何一种求和。那怎么了?
提前致谢。
我认为你把事情复杂化了。如果我没看错的话,你可以这样做:
select session, organization, username,
extract(epoch from max(date_time) - min(date_time)) / 60 duration_minutes
from analysis.user_activity
group by session, organization, username
理由:max(date_time) - min(date_time)
给你一个区间;您可以使用 extract
和 epoch
将其转换为秒数,然后将结果除以 60
将其转换为分钟。
请注意,我还修复了缺少 group by
子句的聚合查询。如果要对所有会话的持续时间求和,则添加另一个聚合级别:
select sum(duration_seconds) / 60 total_duration_minutes
from (
select extract(epoch from max(date_time) - min(date_time)) duration_seconds
from analysis.user_activity
group by session, organization, username
) t
我正在尝试对使用 PostgreSQL 中的 AGE 函数计算的两个值求和。 AGE 应该是计算得出的与该列中不同 (session) 值相关联的 MAX 和 MIN 值(Session 值是不同的)。 AGE 函数应该从 (date_time) 列中提取分钟数,然后从 (date_time) 列中提取小时数,然后将该值乘以 60,然后将这些值相加得到总分钟数session.
我能够通过
成功做到这一点SELECT
session, organization, username,
((date_part('hour',age(MAX(date_time), Min(date_time)))*60) + date_part('minute',age(MAX(date_time),
Min(date_time)))) AS Duration
FROM
analysis.user_activity
enter code here
但是,现在我正在尝试能够根据 GROUP(组织)持续时间的总和来按该函数 returns 的数字的总和进行排序,只需执行 ORDER BY(持续时间)按上面计算的最大单个值排序,而不是按组的整个聚合。这就是问题的开始。首先,我尝试如下:
SELECT
SUM(
(date_part('hour',age(MAX(date_time), Min(date_time)))*60),
date_part('minute',age(MAX(date_time), Min(date_time)))) as SumofDuration
FROM
analysis.user_activity
我得到这个错误:错误:函数总和(双精度,双精度)不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。位置:137。我也收到了关于你不能嵌套聚合函数的错误,所以我把我的 SELECT 分成多个步骤,现在我有如下。
SELECT
session, organization, username,
SUM((SELECT date_part('hour',age(MAX(date_time), Min(date_time)))::integer*60
FROM analysis.user_activity)
,
(SELECT date_part('minute',age(MAX(date_time), Min(date_time)))::integer
FROM analysis.user_activity))
来自 analysis.user_activity
但是,这也给我错误 错误:函数总和(整数,整数)不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。位置:169。我也尝试过使用 numeric 类型。根据文档 https://www.postgresql.org/docs/8.2/functions-aggregate.html,这应该能够对我的函数生成的三种数据类型中的任何一种求和。那怎么了?
提前致谢。
我认为你把事情复杂化了。如果我没看错的话,你可以这样做:
select session, organization, username,
extract(epoch from max(date_time) - min(date_time)) / 60 duration_minutes
from analysis.user_activity
group by session, organization, username
理由:max(date_time) - min(date_time)
给你一个区间;您可以使用 extract
和 epoch
将其转换为秒数,然后将结果除以 60
将其转换为分钟。
请注意,我还修复了缺少 group by
子句的聚合查询。如果要对所有会话的持续时间求和,则添加另一个聚合级别:
select sum(duration_seconds) / 60 total_duration_minutes
from (
select extract(epoch from max(date_time) - min(date_time)) duration_seconds
from analysis.user_activity
group by session, organization, username
) t