计算相对日期范围内的值的最大值
Calculate MAX for value over a relative date range
我正在尝试计算相对日期范围内某个值的最大值。假设我有这些列:日期、周、类别、值。注:Week栏为对应Date所在周的周一
我想生成一个 table,它给出每个日期、周、类别组合的最后两周内的最大值,以便输出生成以下内容:日期、周、类别、值、2WeeksPriorMAX .
我将如何编写该查询?我认为以下内容不会起作用:
SELECT Date, Week, Value,
MAX(Value) OVER (PARTITION BY Category
ORDER BY Week
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as 2WeeksPriorMAX
上述查询未考虑过去 2 周内给定类别、周组合的缺失值的情况,因此在分析前面 2 行时,它会跨越 2 周以上。
左侧连接或使用横向 join/subquery 可能很昂贵。您可以使用 window 函数来执行此操作,但您需要有更多的逻辑:
select t.*,
(case when lag(date, 1) over (partition by category order by date) < date - interval '2 week'
then value
when lag(date, 2) over (partition by category order by date) < date - interval '2 week'
then max(value) over (partition by category order by date rows between 1 preceding and current row)
else max(value) over (partition by category order by date rows between 2 preceding and current row)
end) as TwoWeekMax
from t;
我正在尝试计算相对日期范围内某个值的最大值。假设我有这些列:日期、周、类别、值。注:Week栏为对应Date所在周的周一
我想生成一个 table,它给出每个日期、周、类别组合的最后两周内的最大值,以便输出生成以下内容:日期、周、类别、值、2WeeksPriorMAX .
我将如何编写该查询?我认为以下内容不会起作用:
SELECT Date, Week, Value,
MAX(Value) OVER (PARTITION BY Category
ORDER BY Week
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as 2WeeksPriorMAX
上述查询未考虑过去 2 周内给定类别、周组合的缺失值的情况,因此在分析前面 2 行时,它会跨越 2 周以上。
左侧连接或使用横向 join/subquery 可能很昂贵。您可以使用 window 函数来执行此操作,但您需要有更多的逻辑:
select t.*,
(case when lag(date, 1) over (partition by category order by date) < date - interval '2 week'
then value
when lag(date, 2) over (partition by category order by date) < date - interval '2 week'
then max(value) over (partition by category order by date rows between 1 preceding and current row)
else max(value) over (partition by category order by date rows between 2 preceding and current row)
end) as TwoWeekMax
from t;