我在计算变量时遇到问题。让我们假设我们有一个ID,日期和工资表。现在我的任务是找出每个日期过去6个月的平均工资。有没有其他可能性如何获得这个值而不是笛卡尔积?
我提议的决议:
select ID, Date, AVG(Salary2)
from
(
select tab1.ID as ID, tab1.Date as Date, tab2.Date as Date2, tab2.Salary as Salary2
from table tab1
**JOIN**
(select ID, Date, Salary from table) tab2
on tab1.ID = tab2.ID
and tab1.Date >= tab2.Date
and add_months(tab2.Date, 5) >= tab1.Date
) group by ID, Date;
我认为这种方法无效。我认为就大桌而言太耗时了。
还有其他方法吗?或者我该如何优化这个脚本?
谢谢
答案 0 :(得分:1)
你问的不是很清楚,但我认为你正在寻找这个:
select ID, Date,
AVG(Salary2) OVER (
PARTITION BY ID
ORDER BY DATE
RANGE BETWEEN INTERVAL '6' MONTH PRECEDING AND CURRENT ROW)
from table tab1;
或作为捷径:
select ID, Date,
AVG(Salary2) OVER (
PARTITION BY ID
ORDER BY DATE
RANGE INTERVAL '6' MONTH PRECEDING)
from table tab1;