如何获得前期客户的折扣数?

时间:2014-11-26 20:17:05

标签: sql postgresql postgresql-9.3

我有一个要求,我应该在365天的前一段时间内滚动客户数据。

表:

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), 
('01120736182','ORD33997609' ,'2011-11-23','100265-01',49.99), 
('01120736182','ORD33997609' ,'2011-11-23','200020-01',29.99), 
('01120736182','ORD33997609' ,'2011-11-23','100817-01',44.99), 
('01120736182','ORD89267964' ,'2012-12-05','200251-01',79.99), 
('01120736182','ORD89267964' ,'2012-12-05','200269-01',59.99), 
('01011679971','ORD89332495' ,'2012-12-05','200102-01',169.99), 
('01120736182','ORD89267964' ,'2012-12-05','100907-01',89.99), 
('01120736182','ORD89267964' ,'2012-12-05','200840-01',129.99), 
('01120736182','ORD125155068','2013-07-27','201443-01',199.99), 
('01120736182','ORD167230815','2014-06-05','200141-01',59.99), 
('01011679971','ORD174927624','2014-08-16','201395-01',89.99), 
('01000217334','ORD92524479' ,'2012-12-20','200021-01',29.99), 
('01000217334','ORD95698491' ,'2013-01-08','200021-01',19.99), 
('01000217334','ORD90683621' ,'2012-12-12','200021-01',29.990), 
('01000217334','ORD92524479' ,'2012-12-20','200560-01',29.99), 
('01000217334','ORD145035525','2013-12-09','200972-01',49.99), 
('01000217334','ORD145035525','2013-12-09','100436-01',39.99), 
('01000217334','ORD90683374' ,'2012-12-12','200284-01',39.99), 
('01000217334','ORD139437285','2013-11-07','201794-01',134.99), 
('01000827006','W02238550001','2010-06-11','HL 101077',349.000), 
('01000827006','W01738200001','2009-12-10','EL 100310 BLK',119.96), 
('01000954259','P00444170001','2009-12-03','PC 100455 BRN',389.99), 
('01002319116','W02242430001','2010-06-12','TR 100966',35.99), 
('01002319116','W02242430002','2010-06-12','EL 100985',99.99), 
('01002319116','P00532470001','2010-05-04','HO 100482',49.99);

使用下面的查询我试图通过order_submitted_date获取不同客户的数量:

select
    g.order_date as "Ordered",
    count(distinct o.persistent_key_str) as "customers"
from
    generate_series(
        (select min(ord_submitted_date) from orders),
        (select max(ord_submitted_date) from orders),
        '1 day'
    ) g (order_date) 
left join
    orders o on o.ord_submitted_date between g.order_date - interval '364 days'
                                         and g.order_date
WHERE extract(year from ord_submitted_date) <= 2009
group by 1
order by 1

这是我预期的输出。

Ordered      Customers
2009-12-03   1
2009-12-10   1

当我执行上述查询时,我得到的结果不正确 我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

要获得预期的产出(“不同客户的数量”) - 仅包含实际订单2009的天数:

SELECT ord_submitted_date, count(DISTINCT persistent_key_str) AS customers
FROM   orders
WHERE  ord_submitted_date >= '2009-1-1'
AND    ord_submitted_date <  '2010-1-1'
GROUP  BY 1
ORDER  BY 1;

以这种方式制定WHERE条件以进行查询sargable,并轻松输入。

如果您希望每天一行(从最早的条目到最新的orders) - 在2009年:

SELECT ord_submitted_date AS ordered
     , count(DISTINCT o.persistent_key_str) AS customers
FROM  (SELECT generate_series(min(ord_submitted_date)  -- single query ...
                            , max(ord_submitted_date)  -- ... to get min / max
                            , '1d')::date FROM orders) g (ord_submitted_date) 
LEFT   join orders o USING (ord_submitted_date)
WHERE  ord_submitted_date >= '2009-1-1'
AND    ord_submitted_date <  '2010-1-1'
GROUP BY 1
ORDER BY 1;

SQL Fiddle.

每年与众不同的客户

SELECT extract(year from ord_submitted_date) AS year
     , count(DISTINCT persistent_key_str) AS customers
FROM   orders
GROUP  BY 1
ORDER  BY 1;

SQL Fiddle.