在Postgres SQL中计算当前行和prev行的值

时间:2017-11-21 03:00:20

标签: postgresql

美好的一天!我需要帮助计算基于给定月份的类别的7天回调间隔。输出将是所有类别的总回叫。
我真的很有帮助大tanks!

样本表:

mif(category) |date_started
1             | 2017/01/5
1             | 2017/01/11     * count as 7 day interval cat1 #1<br>
1             | 2017/01/23
2             | 2017/01/5 
2             | 2017/01/7      * count as 7 day interval in cat2 #1 <br>
2             | 2017/01/9      * count as 7 day interval in cat2 #2<br>
3             | 2017/01/5
3             | 2017/01/23 
3             | 2017/01/25     * count as 7 day interval in cat3 #2<br/><br>

最终输出= 4(所有类别中所有回调的总和)
我已经创建了一个带有for循环的函数来循环每个mif(类别)

CREATE OR REPLACE FUNCTION public.service_call_back(IN i_month integer, IN i_year integer, OUT o_val integer)
Returns integer
LANGUAGE plpgsql
as $function$
declare
v_looper integer;
v_counter integer;
begin
   for v_looper in select distinct mif from service_report where  extract(month from date_time_started) = i_month AND extract(year from date_time_started) = I_year order by mif

loop

#category

end loop

1 个答案:

答案 0 :(得分:0)

我建议你使用如下的查询来同时计算两个计数。虽然你没有解释7天回调意味着什么通过推论,它似乎是任何一行,其间的天数是7或更少,所以可以使用滞后函数为我们提供前一个日期和然后计算天数。

请注意,将存储日期与计算日期进行比较,而不是将每个存储日期转换为月份值和年份值,这样做会更好。

选择       mif,mif_count,call_back_7s,sum(call_back_7s)over()sum_callbacks 来自(       选择             MIF           ,count(*)mif_count           ,数(                提取时的情况(从date_time_started开始的天数 - prev_call_date)&lt; = 7然后1结束                  )call_back_7s       来自(               选择                     *                   ,lag(date_time_started,1)over(由mif order by date_time_started分区)prev_call_date               来自service_report               其中date_time_started&gt; = make_date(2017,1,1)               AND date_time_started&lt; make_date(2017,1,1)+ interval&#39; 1个月&#39;               )sr       由mif组     )d

要使用您的临时参数创建日期,然后将其放入make_date函数中,如下所示:

make_date(i_year , i_month, 1)

<强> Demo

| mif | mif_count | call_back_7s | sum_callbacks |
|-----|-----------|--------------|---------------|
|   1 |         3 |            1 |             4 |
|   2 |         3 |            2 |             4 |
|   3 |         3 |            1 |             4 |