使用递归作为循环创建临时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上没有循环。