2017-03-23 82 views
1

我使用红移的Postgres从单一插入多行选择

我想要的输出为每天

输出表monthly_user_activity

id maudate  date  userid 
1 2016-10-10 2016-10-10 MjA1MDATG2TDUwOTE2MD 
2 2016-10-11 2016-10-10 MjA1MDATG2TDUwOTE2MD 
3 2016-10-12 2016-10-10 MjA1MDATG2TDUwOTE2MD 
4 2016-10-13 2016-10-10 MjA1MDATG2TDUwOTE2MD 
5 2016-10-14 2016-10-10 MjA1MDATG2TDUwOTE2MD 
6 2016-10-15 2016-10-10 MjA1MDATG2TDUwOTE2MD 
7 2016-10-16 2016-10-10 MjA1MDATG2TDUwOTE2MD 
... 
30 2016-11-09 2016-10-10 MjA1MDATG2TDUwOTE2MD 

输入表user_activity:

id date  userid 
1 2016-10-10 MjA1MDATG2TDUwOTE2MD  

我的输入只是一行代表一天中的用户活动,对于e在此表下面我想在未来创造天30个副本ACH行,我这是怎么会计算每日MAU

我想这样的事情,下面我愿意来运行此查询30次,它似乎不是很干。

INSERT INTO monthly_user_activity 
(maudate, date, userid) 
SELECT 
original_date::date + interval '0 day', 
original_date, 
userid 
FROM (
SELECT 
date as original_date, 
userid 
FROM 
    user_activity 
) 

INSERT INTO monthly_user_activity 
(maudate, date, userid) 
SELECT 
original_date::date + interval '1 day', 
original_date, 
userid 
FROM (
SELECT 
date as original_date, 
userid 
FROM 
    user_activity 
) 

INSERT INTO monthly_user_activity 
(maudate, date, userid) 
SELECT 
original_date::date + interval '2 day', 
original_date, 
userid 
FROM (
SELECT 
date as original_date, 
userid 
FROM 
    user_activity 
) 

---... 
INSERT INTO monthly_user_activity 
(maudate, date, userid) 
SELECT 
original_date::date + interval '30 day', 
original_date, 
userid 
FROM (
SELECT 
date as original_date, 
userid 
FROM 
    user_activity 
) 

从评论 更新这是使用你发给我的链接的正确方法。

SELECT 
id 
d::date, 
date as original_date, 
userid 
FROM user_activity, 
(
select (dateadd(day, +row_number() over (order by true), date)) as d 
    from user_activity limit 30 
) 
+0

Redshift不以有用的方式支持generate_series。有解决方法:http://stackoverflow.com/a/34167753/3019685。 – systemjack

回答

3

PostgreSQL 8.4后:

随着generate_series(start, stop, step interval)可以填充日期为您每月插入数据:

SELECT 
t.d::date, 
date as original_date, 
user_id 
FROM user_activity, 
generate_series(date,date+ interval '1 month - 1 day','1 day') t(d) 

看看这个链接获取更多信息generate_series

PostgreSQL 8.4,然后才能创建你自己的功能:

create or replace function generate_series_date(begin_date integer,end_date integer) 
RETURNS integer AS $$ 

declare 

affected_rows integer :=0; 
integer_var integer:=0; 

begin 
FOR i IN begin_date..end_date LOOP 
    INSERT INTO monthly_user_activity 
    (mau_date, date, user_id) 
    select 
    date+ "interval"(''''||i||' day'''), 
    date, 
    user_id 
    FROM user_activity; 

    GET DIAGNOSTICS integer_var = ROW_COUNT; 
    affected_rows = affected_rows+integer_var; 

    END LOOP; 

    return affected_rows; 

    end; 
$$ LANGUAGE plpgsql 
+0

我越来越多的函数generate_series(时间戳没有时区,时间戳没有时区,“未知”)不存在; –

+0

什么是PostgreSQL版本? –

+0

i686-pc-linux-gnu上的PostgreSQL 8.0.2,由GCC gcc编译(GCC)3.4.2 20041017(Red Hat 3.4.2-6.fc3),Redshift 1.0.1231 –