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



我有三个表,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中提取年份的子字符串(。

有办法绕过这个吗?一位同事建议使用分区,但这不是也阻止了一年后在小组中使用吗?

以下是我汇总所有记录的方法,其中注释了用于抓取特定年份的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;

有没有一种方法可以通过嵌套组,这样我仍然可以使用最小聚合和最低级别,然后在更高级别使用平均聚合?

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

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