sql - 如何生成当前日期前 6 个月的平均支出

标签 sql postgresql

我正在使用 postgres 9.3。而且我对运行总计的了解不多

我有一个要求,我需要每年生成一份报告,其中包含客户在给定年份的第一个订单前后的平均六个月支出。

架构如下:

CREATE TABLE orders
(
  persistent_key_str character varying,
  ord_id character varying(50),
  ord_submitted_date date,
  item_sku_id character varying(50),
  item_extended_actual_price_amt numeric(18,2)
);





INSERT INTO orders VALUES ('01120736182','ORD6266073','2010-12-08','100856-01',39.90);
INSERT INTO orders   VALUES('01120736182','ORD33997609','2011-11-23','100265-01',49.99);
 INSERT INTO orders VALUES('01120736182','ORD33997609','2011-11-23','200020-01',29.99);
 INSERT INTO orders VALUES('01120736182','ORD33997609','2011-11-23','100817-01',44.99);
 INSERT INTO orders VALUES('01120736182','ORD89267964','2012-12-05','200251-01',79.99);
 INSERT INTO orders VALUES('01120736182','ORD89267964','2012-12-05','200269-01',59.99);
 INSERT INTO orders VALUES('01011679971','ORD89332495','2012-12-05','200102-01',169.99);
INSERT INTO orders VALUES('01120736182','ORD89267964','2012-12-05','100907-01',89.99);
 INSERT INTO orders VALUES('01120736182','ORD89267964','2012-12-05','200840-01',129.99);
 INSERT INTO orders VALUES('01120736182','ORD125155068','2013-07-27','201443-01',199.99);
 INSERT INTO orders VALUES('01120736182','ORD167230815','2014-06-05','200141-01',59.99);
 INSERT INTO orders VALUES('01011679971','ORD174927624','2014-08-16','201395-01',89.99);

这是我的:

    WITH year_cte
as
(
    SELECT EXTRACT(YEAR FROM ord_submitted_date) ord_year, ord_id, ord_submitted_date from ORDERS
)

SELECT  --persistent_key_str
     c.ord_year  
    --, ord_id 
    , AVG(AVG(o.item_extended_actual_price_amt)) OVER(PARTITION BY c.ord_year) Avg_6_month_spend
FROM orders  o INNER JOIN year_cte c ON c.ord_id = o.ord_id
WHERE o.ord_submitted_date between (c.ord_submitted_date - interval '365 days')::date and  c.ord_submitted_date 
group by o.ord_submitted_date, o.item_extended_actual_price_amt, c.ord_year 

Here is a SQLFiddle with the above .

如果能在任务中提供一些指导,我将不胜感激。


我希望看到这样的事情。 "Ord_year","平均 6 个月花费"

2010, 1645.39, 
2011, 255.94, 
2012, 247.53, 
2013, 230.36, 
2014, 239.82,

最佳答案

试试这个查询:

SELECT q.year, avg( o.item_extended_actual_price_amt )  
FROM (
   SELECT EXTRACT(YEAR FROM ord_submitted_date) as year,
          min( ord_submitted_date ) as first_order_date
   FROM ORDERS
   GROUP BY year
) q
JOIN ORDERS o
ON o.ord_submitted_date 
   BETWEEN q.first_order_date - INTERVAL '6 months'
       AND q.first_order_date + INTERVAL '6 months'
GROUP BY q.year
ORDER BY q.year
;

演示:http://sqlfiddle.com/#!15/3e570/29

关于sql - 如何生成当前日期前 6 个月的平均支出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27083228/

相关文章:

sql - 字符串或二进制数据将被截断SQL错误

sql - JPA,获取所有元素

mysql - MySQL 的 SQL 查询

optimization - 性能优化 - Postgres

sql - 区分、计数、分组查询疯狂

sql - PLSQL 或 SSRS,如何选择将所有值都放在一个组中?

sql - 使用 try-catch block 在 Sql-Server 中删除表

python-3.x - Postgres、sqlalchemy 和多处理

sql - 如何插入非分组数据

php - Free Fat Framework a Select with ILIKE Postgresql Statement