Oracle解决方案:
一种选择是使用分析函数LAG() Over()和带有窗口范围指定的AVG() Over(),在同一行中获取所需值(如下主SQL语句的内层查询):
-- 示例数据定义:
WITH sales_list (A_DATE, A_COUNT, PROFIT) AS
(
Select DATE '2023-12-01', 20, 100 From Dual Union All
Select DATE '2023-12-02', 50, 280 From Dual Union All
Select DATE '2023-12-03', 125, 660 From Dual Union All
Select DATE '2023-12-04', 165, 850 From Dual Union All
Select DATE '2023-12-05', 85, 150 From Dual Union All
Select DATE '2023-12-06', 150, 710 From Dual Union All
Select DATE '2023-12-07', 180, 740 From Dual
)
-- 主要SQL查询:
Select A_DATE, A_COUNT, PROFIT, AVG_PREV_2, AVG_NEXT_2
From (
Select A_DATE, A_COUNT, PROFIT,
LAG(A_COUNT) Over(Order By A_DATE) "PREV_COUNT",
AVG(PROFIT) Over(Order By A_DATE Rows Between 2 Preceding And 1 Preceding) "AVG_PREV_2",
AVG(PROFIT) Over(Order By A_DATE Rows Between 1 Following And 2 Following) "AVG_NEXT_2"
From sales_list
) As derived_table
Where PREV_COUNT < 100 And A_COUNT >= 100
/*
结果:
A_DATE A_COUNT PROFIT AVG_PREV_2 AVG_NEXT_2
-------- ---------- ---------- ---------- ----------
03.12.23 125 660 190 500
06.12.23 150 710 500 740
*/