SQL 难点解决:序列生成

8次阅读

共计 2259 个字符,预计需要花费 6 分钟才能阅读完成。

1、生成连续整数序列
MySQL8: with recursive t(n) as (
select 1
union all
select n+1 from t where n<7
)
select * from t;
Oracle:select level n
from dual connect by level<=7;
集算器 SPL:

A1:构造从 1 到 7 的整数序列

示例 1:百鸡问题,鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、母、雏各几
MySQL8:
with recursive jg(n) as (select 1 union all select n+1 from jg where n<100/5),
jm(n) as (select 1 union all select n+1 from jm where n<100/3),
jc(n) as (select 3 union all select n+3 from jc where n<98)
select jg.n jw, jm.n jm, jc.n jc
from jg cross join jm cross join jc
where jg.n*5+jm.n*3+jc.n/3=100 and jg.n+jm.n+jc.n=100
集算器 SPL:

A1:构造 1 到 20 的整数序列
A2:构造 1 到 33 的整数序列
A3:构造 1 到 99 且步长为 3 的整数序列
A4:创建数据结构为 (jw,jm,jc) 的序表
A5:对 A1、A2、A3 的数据进行嵌套循环,若满足于 A1 成员 +A2 成员 +A3 成员 ==100 且 A1 成员 *5+A2 成员 *3+A3 成员 /3==100 则追加到 A4 序表中

示例 2:将指定列中冒号分隔的串划分成多行
Oracle:
with t(k,f) as (select 1 , ‘a1:a2:a3’ from dual
union all select 2, ‘b1:b2′ from dual),
t1 as (select k,f, length(f)-length(replace(f,’:’,”))+1 cnt from t),
t2 as (select level n from dual connect by level<=(select max(cnt) from t1)),
t3 as (select t1.k, t1.f, n, cnt,
case when n=1 then 1 else instr(f,’:’,1,n-1)+1 end p1,
case when n=cnt then length(f)+1 else instr(f,’:’,1,n) end p2
from t1 join t2 on t2.n<=t1.cnt)
select k,substr(f,p1,p2-p1) f from t3 order by k;
集算器 SPL:

A1:创建数据结构为 (k,f) 的序表,并追加 2 条记录 (1,“a1:a2:a3) 和(2,”b1:b2”)
A2:将 A1 的字段 f 用冒号划分成序列并重新赋值给字段 f
A3:针对 A1 每条记录构造数据结构为 (k,f) 的序表,并根据字段 f 中成员构造记录 (A1.k,f 成员) 追加到此序表中

2、生成连续日期序列
MySQL8:
with recursive
t(d) as (select date’2018-10-03′
union all
select d+1 from t where d<date’2018-10-09′)
select d,dayofweek(d) w from t;
集算器 SPL:

A1:生成 2018-10-03 到 2018-10-09 的日期序列

示例:列出 2015-01-03 到 2015-01-07 每天的销量汇总
MySQL8:
with recursive
t(d,v) as (select date’2015-01-04′,30
union all select date’2015-01-06′,50
union all select date’2015-01-07′,50
union all select date’2015-01-03′,40
union all select date’2015-01-04′, 80),
s(d) as (select date’2015-01-03′
union all
select d+1 from s where d<date’2015-01-07′)
select s.d, sum(t.v) v
from s left join t on s.d=t.d
group by s.d;
集算器 SPL:

A4:A2 中记录按字段 d 的值对齐到 A3
A5:根据 A4 和 A3 对位构造统计后的序表

3、生成连续的工作日 (不包含周六周日) 序列
MySQL8:
with recursive
t(d) as (select date’2018-10-03′
union all
select d+1 from t where d<date’2018-10-09′)
select d,dayofweek(d) w from t
where dayofweek(d)<=5;
集算器 SPL:

A1:构造从 2018-10-03 到 2018-10-09 不包含周六周日的日期序列
A2:根据 A1 构造日期及相应周几的序表

4、根据序列生成表
MySQL8:
with recursive t1(n) as (select 1 union all select n+1 from t1 where n<14),
t2(n, name) as (select n, concat(‘a’,n) name from t1)
select max(if(n%4=1, name, null)) f1,
max(if(n%4=2, name, null)) f2,
max(if(n%4=3, name, null)) f3,
max(if(n%4=0, name, null)) f4
from t2
group by floor((n+3)/4);
集算器 SPL:

正文完
 0