2014-11-22 53 views
1

我正在使用postgres 9.3。我沒有太多的曝光與運行總計如何在當前日期之前生成6個月平均花費

我有一個要求,我需要每年產生一個報告,平均六個月的消費在他們的第一個訂單之前或之後在給定的一年。

下面是模式:

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, 
+0

什麼是客戶的標誌?看來日期可以在下一年或上一年進行? – 2014-11-22 22:48:36

+0

@MladenUzelac,它可能是。 – user7922 2014-11-23 04:32:15

+0

你在avg(avg(...))中有額外的平均值。結果是一樣的。要在窗口函數中獲得排名,請使用rank()函數(如果要在一年內獲得第一個日期)。數據中的查詢很困難,因爲您的數據的訂單間隔爲一年。所以要獲得6個月前後是不可能的。 – 2014-11-23 09:56:40

回答

0

嘗試此查詢:

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

+0

這接近。 – user7922 2014-11-24 01:53:54

+0

看這個演示:http://sqlfiddle.com/#!15/5897e/4,我得到的平均1年花費和平均6個月花費可能不正確。我該如何糾正?有任何想法嗎! – user7922 2014-12-02 21:42:47

+0

進一步解釋說明,演示中的CTE會生成我在計算平均六個月支出時在排除中排除的客戶的首次訂單。 – user7922 2014-12-02 21:52:12

相關問題