Postgresql中的日期限制运行平均值-如何划分为四周
我有一张表,上面有销售日期(每周:每周六)、商品ID和销售额。我想要一个平均四周的跑步记录。我需要将数据按ID划分为四周的部分,但我无法确定如何执行语法 样本表:Postgresql中的日期限制运行平均值-如何划分为四周,postgresql,date,Postgresql,Date,我有一张表,上面有销售日期(每周:每周六)、商品ID和销售额。我想要一个平均四周的跑步记录。我需要将数据按ID划分为四周的部分,但我无法确定如何执行语法 样本表: ID date value four_wk_average <p>123 04/05/2019 1640.88 1640.88 <p>123 11/05/2019 2093.4 1867.14 <p>123 18/05/2019 2671.57 2135.28 <p&
ID date value four_wk_average
<p>123 04/05/2019 1640.88 1640.88
<p>123 11/05/2019 2093.4 1867.14
<p>123 18/05/2019 2671.57 2135.28
<p>123 25/05/2019 2034.6 2110.11
<p>123 01/06/2019 1564.62 2001.01
<p>123 08/06/2019 2143.29 2024.73
<p>123 15/06/2019 2007 2022.19
<p>123 22/06/2019 2329.35 2060.59
<p>123 29/06/2019 2794.32 2142.11
<p>123 06/07/2019 3380.05 2265.91
正确的值应该是
ID date value four_wk_average
<p>123 04/05/2019 1640.88 1640.88
<p>123 11/05/2019 2093.4 1867.14
<p>123 18/05/2019 2671.57 2135.28
<p>123 25/05/2019 2034.6 2110.11
<p>123 01/06/2019 1564.62 2091.05
<p>123 08/06/2019 2143.29 2103.52
<p>123 15/06/2019 2007 1937.38
<p>123 22/06/2019 2329.35 2011.07
<p>123 29/06/2019 2794.32 2318.49
<p>123 06/07/2019 3380.05 2627.68
ID日期值四周平均值
123 2019年5月4日1640.88 1640.88
123 2019年5月11日2093.4 1867.14
123 2019年5月18日2671.57 2135.28
123 2019年5月25日2034.6 2110.11
12301/06/2019 1564.62 2091.05
123 2019年6月8日2143.29 2103.52
123 2019年6月15日2007年1937.38
123 2019年6月22日2329.35 2011.07
123 2019年6月29日2794.32 2318.49
12306/07/2019 3380.05 2627.68
我认为我的分区将我的间隔部分作为布尔测试,并返回TRUE——我不知道如何在窗口函数中表示日期范围
谢谢大家!
方法1:这适用于Postgres 11+和每周多个记录
SELECT
*,
AVG(value) OVER (ORDER BY the_date RANGE BETWEEN interval '4 weeks - 1 day' PRECEDING AND CURRENT ROW)
FROM
sales
间隔为4周:4周减去1天再加上当天
方法2:这也适用于研究生 方法1:这适用于Postgres 11+和每周多个记录
SELECT
*,
AVG(value) OVER (ORDER BY the_date RANGE BETWEEN interval '4 weeks - 1 day' PRECEDING AND CURRENT ROW)
FROM
sales
间隔为4周:4周减去1天再加上当天
方法2:这也适用于Postgres Lifesaver:我使用了方法2,它工作得非常好。还感谢您的进一步阅读-我曾试图在互联网上搜索如何做到这一点,但我找不到任何东西。再次感谢。嗨!我很抱歉没有早点回答。当我将所有数据放在一起时,这不起作用-在这种情况下,数据按国家和ID分组。您的三个选项中哪一个最适合这种情况?以Excel的方式思考,我想在ID和国家匹配的条件下做一个平均。或者我可以对我正在执行此操作的子查询进行任何排序,以使前面的行语法正常工作?非常感谢。不过,我当然可以帮你。但在这种情况下,我真的需要样本数据和预期的输出以及。所以,请尝试创建一个小提琴(就像我在回答中所做的那样)和/或打开一个全新的问题!救命恩人:我用了方法2,效果很好。还感谢您的进一步阅读-我曾试图在互联网上搜索如何做到这一点,但我找不到任何东西。再次感谢。嗨!我很抱歉没有早点回答。当我将所有数据放在一起时,这不起作用-在这种情况下,数据按国家和ID分组。您的三个选项中哪一个最适合这种情况?以Excel的方式思考,我想在ID和国家匹配的条件下做一个平均。或者我可以对我正在执行此操作的子查询进行任何排序,以使前面的行语法正常工作?非常感谢。不过,我当然可以帮你。但在这种情况下,我真的需要样本数据和预期的输出以及。所以,请尝试创建一个小提琴(就像我在回答中所做的那样)和/或打开一个全新的问题!
SELECT
*,
AVG(value) OVER (ORDER BY the_date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
FROM
sales
SELECT
s1.*,
(SELECT AVG(s2.value)
FROM sales s2
WHERE s2.the_date <= s1.the_date
AND s2.the_date > s1.the_date - interval '4 weeks')
FROM sales s1;