首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从单个选择中插入多行

从单个选择中插入多行
EN

Stack Overflow用户
提问于 2017-03-23 22:44:29
回答 1查看 158关注 0票数 1

我正在使用红移postgres

我想要每天的产出

输出表monthly_user_activity

代码语言:javascript
复制
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:

代码语言:javascript
复制
id  date        userid
1   2016-10-10  MjA1MDATG2TDUwOTE2MD    

我的输入只是表示一天中的用户活动的单个行,对于下表中的每一行,我希望在未来创建30天的副本,这就是我将如何计算每天的MAU。

下面我尝试了类似的方法,但是我必须运行这个查询30次,而且它看起来不太枯燥。

代码语言:javascript
复制
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
)

从注释更新是正确的方式,使用您发送给我的链接。

代码语言:javascript
复制
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
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-23 23:02:26

PostgreSQL 8.4之后:

使用generate_series(start, stop, step interval),您可以填充每月插入数据的日期:

代码语言:javascript
复制
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)

查看此链接以获得更多信息系列

PostgreSQL 8.4之前,您可以创建自己的函数:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42988345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档