Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用递归作为循环创建临时sql表,以填充自定义时间间隔_Sql_Sqlite_Recursion - Fatal编程技术网

使用递归作为循环创建临时sql表,以填充自定义时间间隔

使用递归作为循环创建临时sql表,以填充自定义时间间隔,sql,sqlite,recursion,Sql,Sqlite,Recursion,假设您有一张如下所示的桌子: id subscription_start subscription_end segment 1 2016-12-01 2017-02-01 87 2 2016-12-01 2017-01-24 87 ... first_day last_day 2017-01-01 2017-01-31 2017-02-01 2017-02-31 2017-03-01 2017-03-31 并希望生成一个包含月份的临时表 一种方法是将月份日

假设您有一张如下所示的桌子:

id  subscription_start  subscription_end    segment
1   2016-12-01  2017-02-01  87
2   2016-12-01  2017-01-24  87
...
first_day   last_day
2017-01-01  2017-01-31
2017-02-01  2017-02-31
2017-03-01  2017-03-31
并希望生成一个包含月份的临时表

一种方法是将月份日期编码为:

with months as (
   select
     '2016-12-01' as 'first',
     '2016-12-31' as 'last'
   union
   select 
     '2017-01-01' as 'first',
     '2017-01-31' as 'last'
   ...
) select  * from months;
因此,我有一个输出表,如:

id  subscription_start  subscription_end    segment
1   2016-12-01  2017-02-01  87
2   2016-12-01  2017-01-24  87
...
first_day   last_day
2017-01-01  2017-01-31
2017-02-01  2017-02-31
2017-03-01  2017-03-31
我想生成一个具有上述自定义间隔的临时表,而不需要手动编码所有日期

假设间隔为12个月,每年,db中的年数相同。 我希望有一个通用的方法来计算具有与上面相同输出的月份表

或者,可以将范围调整为自定义间隔月,将一年分为12个部分,但可以将时间分割为自定义间隔天

首先,我考虑使用递归查询,如:

  with months(id, first_day, last_day, month) as (
  select
    id,
    first_day,
    last_day,
    0
  where
    subscriptions.first_day = min(subscriptions.first_day)
  union all
  select
    id,
    first_day,
    last_day,
    months.month + 1
  from
    subscriptions
    left join months on cast(
      strftime('%m', datetime(subscriptions.subscription_start)) as int
    ) = months.month
  where
    months.month < 13
)
select
  *
from
  months
where
  month = 1;
但它并没有达到我预期的效果:在这里,我试图从具有最小日期的表中选择第一行,并每隔几个月(从1到12)填充一个表。对于每个月,我都会比较表中的字符串日期字段,例如2017-03-01=3是三月


上面的查询确实有效,而且似乎有点复杂,但是为了学习,您建议在不手动编码时间间隔的情况下创建一个临时表月份?我有点不清楚1您要查找的结果是什么请以表格文本的形式显示?2当前查询是否生成所需结果?谢谢@GMB,添加了输出表1,当前查询未生成所需结果2。正在查找一个查询,该查询不需要手动编码日期即可提供所需结果,并且可以指定自定义时间范围。我尝试使用递归,因为sql上没有循环。我对1有点不清楚,您要查找的结果是什么请将其显示为表格文本?2当前查询是否生成所需结果?谢谢@GMB,添加了输出表1,当前查询未生成所需结果2。正在查找一个查询,该查询不需要手动编码日期即可提供所需结果,并且可以指定自定义时间范围。我试图使用递归,因为sql上没有循环。