不包括第一行的间隔之间的范围



我有一行:

sum(purchases) over(partition by category order by value_day range between interval '1' month preceding and current row) 

如果value_day = Aug 21,它返回从7月21日到8月21日的总和,但我需要从7月22日到8日21日。

我该怎么做?

您可以使用表达式来定义窗口的起点。所以你可以

  • 从当前日期减去一个月
  • 添加一天

给予类似的东西:

sum ( purchases ) over (
partition by category 
order by value_day 
range between ( value_day - ( add_months ( value_day, -1 ) + 1 ) ) preceding 
and current row
) 

您可以:

  • 使用两个窗口函数,其中一个函数添加上个月的所有内容,然后减去第二个函数,该函数刚好覆盖您不想包含的范围;或
  • 使用相关的子查询,而不是窗口分析函数
SELECT t.*,
sum(purchases) over(
partition by category
order by value_day
range between interval '1' month preceding and current row
) -
COALESCE(
sum(purchases) over(
partition by category
order by value_day
range between interval '1' month preceding and interval '1' month preceding
),
0
) AS total1,
( SELECT SUM(s.purchases)
FROM   table_name s
WHERE  t.category = s.category
AND    ADD_MONTHS(t.value_day, -1) + INTERVAL '1' DAY <= s.value_day
AND    s.value_day <= t.value_day
) AS total2
FROM   table_name t;

对于样本数据:

CREATE TABLE table_name (category, value_day, purchases) AS
SELECT 1, DATE '2022-01-01' + LEVEL - 1, LEVEL
FROM   DUAL
CONNECT BY LEVEL <= 50;

输出:

>52758<1023>054<1054>
CATEGORYVALUE_DAY
122年2月1日32
102-FEB-2233
122年2月3日122年2月4日122年2月5日122年2月6日122年2月7日108-FEB-22122年2月9日110-FEB-22122年2月11日122年2月12日122年2月13日122年2月14日122年2月15日122年2月16日122年2月17日48
118-FEB-2249
122年2月19日

最新更新