我正在使用PostgreSQL 9.3.9,我有一个名为list_all_upsells的过程,它接受一个月份的开始和结束。(请参见sqlfiddle.com/#!15/abd02获取示例数据)例如,下面的代码将列出10月份的升级帐户计数:
select COUNT(up.*) as "Total Upsell Accounts in October" from
list_all_upsells('2015-10-01 00:00:00'::timestamp, '2015-10-31 23:59:59'::timestamp) as up
where up.user_id not in
(select distinct user_id from paid_users_no_more
where concat(extract(month from payment_stop_date),'-',extract(year from payment_stop_date))<>
concat(extract(month from payment_start_date),'-',extract(year from payment_start_date)));
list_all_upsells过程如下:
DECLARE
payor_email_2 text;
BEGIN
FOR payor_email_2 in select distinct payor_email from paid_users LOOP
return query
execute
'select paid_users.* from paid_users,
(
select payment_start_date as first_time from paid_users
where payor_email = $3
order by payment_start_date limit 1
) as dummy
where payor_email = $3
and payment_start_date > first_time
and payment_start_date between $1 and $2
and first_time < $1'
using a, b, payor_email_2;
END LOOP;
return;
END
我希望能够运行所有有记录的月份,并将数据查询合并在一个表格中,如下所示:
Month | Total Upselled Accounts
---------------------------------
08/2014 | 23
09/2014 | 35
ETC...
10/2015 | 56
我有一个查询,可以获取我们从业以来每个月的第一天和最后一天:
select distinct date_trunc('month', payment_start_date)::date as startmonth
from paid_users ORDER BY startmonth;
月底处理:
SELECT distinct (date_trunc('MONTH', payment_start_date) +
INTERVAL '1 MONTH - 1 day')::date as endmonth from paid_users
ORDER BY endmonth;
现在,我如何创建一个函数来循环遍历
list_all_upsells
,并获取每个月的计数?即第一个查询对于startmonth
给出了2014-03-01、2014-04-01,一直到2015-10-01,而第二个查询对于endmonth
给出了2014-03-31、2014-04-30,一直到2015-10-31。我想要在每个月上运行list_all_sells
,以便我可以得到每个月的升级帐户数的聚合计数。我的
paid_users
表格看起来像这样:CREATE TABLE paid_users
(
user_id integer,
user_email character varying(255),
payor_id integer,
payor_email character varying(255),
payment_start_date timestamp without time zone DEFAULT now()
)
paid_users_no_more
:
CREATE TABLE paid_users_no_more
(
user_id integer,
payment_stop_date timestamp without time zone DEFAULT now()
)