在 oracle SQL 中,有没有一种好方法可以按年份或其他一些不在 select 语句中的变量来分解聚合结果?

Posted

技术标签:

【中文标题】在 oracle SQL 中,有没有一种好方法可以按年份或其他一些不在 select 语句中的变量来分解聚合结果?【英文标题】:In oracle SQL, is there a good way to break out the results of an aggregate by year or some other variable not in the select statement? 【发布时间】:2021-09-25 08:10:07 【问题描述】:

我有 3 个表,A、B 和 C(A 和 B 之间的外部参照以及一些附加数据)。

A:A_id,A_type,A_status,A_Start_Date,A_department B:B_id,B_Date C:A_id,B_id

我试图找出 B_date 和 A_Start_Date 之间的平均天数,然后按年份分解,除了每个 A_id,我只关心它所链接的最早日期的 B_id。通常每个 A_id 都与多个 B_id 配对。

我可以编写查询来为我提供所有行的聚合值,或者在运行之间的 where 子句中调整日期范围以获取给定年份的聚合,甚至拉出所有行(这给了我 A_id 和A_Start_date 与最小日期 B_id 和 B_Date 配对),但我使用聚合“MIN”来获取最小日期也排除了按年份分组(从 A_Start_Date 中提取年份的子字符串)。

有没有办法解决这个问题?一位同事建议使用分区,但这不也阻止了一年后在 group by 中使用吗?

这是我用于汇总所有记录的内容,其中用于获取特定年份的 where 语句已被注释掉。我希望能够将结果显示为每年的平均值,或每个部门的平均值,或两者兼而有之:

SELECT
TRUNC(AVG(A_START_DATE - MIN(B_DATE)),1) as Days_Between
FROM A
LEFT JOIN C ON c.A_id = A.A_id
LEFT JOIN B ON b.B_id = c.B_id
WHERE A.A_Type = 'PPP' AND
A.A_start_date IS NOT NULL
--AND (A.A_start_date > '01-JAN-2010' AND A.A_start_date < '01-JAN-2022')
GROUP BY A.A_id,A.A_START_DATE;

有没有一种方法可以嵌套组,以便我仍然可以使用最小聚合和最低级别,然后使用更高级别的 avg 聚合?

【问题讨论】:

【参考方案1】:

我试过了,认为我已经得到了我需要的东西 - 这是最好的处理方式吗?:

SELECT YEAR,TRUNC(AVG(DAYSBET),1)as Avg_Days_to_Settle FROM (SELECT distinct
  To_char(A.A_start_date, 'YYYY') Year,
  A.A_start_date - Min(B.B_date) over (partition by A.A_id, To_char(A.A_start_date, 'YYYY') daysBet
FROM
  A,
  B,
  C 
WHERE  
   C.A_ID = A.A_ID and
  B.B_ID = C.B_ID and
  A.A_TYPE = 'PPP' and
  A.A_START_DATE IS NOT NULL
 )
 GROUP BY YEAR
 ORDER BY YEAR

【讨论】:

以上是关于在 oracle SQL 中,有没有一种好方法可以按年份或其他一些不在 select 语句中的变量来分解聚合结果?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中调整内容 UIView 的大小,有没有一种好方法可以做到这一点而无需进行任何计算?

始终连接 SQL 表是一种好习惯吗?

有没有一种好方法可以将 pychecker/pylint 应用于 Tornado 模板中的 python 代码?

有没有一种好方法可以将文件中具有特定字符(不是文件名)的 .txt 文件移动到另一个目录?

有没有一种好方法可以最大限度地减少 Google Maps Roads API 的负载?

学习KMP算法时想到的另一种好方法