Mysql bigquery SQL用于计算项目计划的开始和完成时间
需要开发一个递归的大查询SQL来计算时间表的开始和完成时间。 注意:活动的计划数量可能会有所不同 P1、P2和P3是行活动的前置ID 一个活动只能有一个前置或多个前置 开始和结束列的计算如下所示 起始值等于2017-01-01的较大值或其前身的最大完工值+1 完成始终是开始+持续时间-1的函数 在得到答案之前,预计计算将是递归的Mysql bigquery SQL用于计算项目计划的开始和完成时间,mysql,sql,google-bigquery,Mysql,Sql,Google Bigquery,需要开发一个递归的大查询SQL来计算时间表的开始和完成时间。 注意:活动的计划数量可能会有所不同 P1、P2和P3是行活动的前置ID 一个活动只能有一个前置或多个前置 开始和结束列的计算如下所示 起始值等于2017-01-01的较大值或其前身的最大完工值+1 完成始终是开始+持续时间-1的函数 在得到答案之前,预计计算将是递归的 ID NAME DURATION START FINISH P1 P2 P3 1 A 14
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
我在bigquery中需要它的原因是通过改变持续时间值的迭代来执行计划的模拟。
以上附表的答覆如下:
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
BigQuery不支持递归查询 因此,您需要根据自己的选择来编排递归性
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
下面演示如何通过运行一系列查询来实现这一点,直到所有依赖项都得到解决
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
步骤1:准备初始表格-yourproject.yourdataset.yourtable这里是从您的问题中选取的简单示例
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
步骤2:运行迭代查询,目标表与源表相同-yourproject.yourdataset.yourtable with Write Preference>>覆盖表
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
标准SQL
选择a.id、a.name、a.duration、a.p1、a.p2、a.p3、,
开始
日期\添加开始,间隔a.持续时间-1天完成
来自'yourproject.yourdataset.yourtable'a
左JOIN`yourproject.yourdataset.yourtable`a1 ON a.p1=a1.id
左JOIN`yourproject.yourdataset.yourtable`a2 ON a.p2=a2.id
左JOIN`yourproject.yourdataset.yourtable`a3 ON a.p3=a3.id
交叉连接[
IFa.id=a.p1,日期“2017-01-01”,
选择日期\u ADDMAXfinish,间隔1天
从UNNEST[a1.饰面,a2.饰面,a3.饰面]饰面
其中,IFa.p1为空,0,1+IFa.p2为空,0,1+IFa.p3为空,0,1=
IFa1.finish为NULL,0,1+IFa2.finish为NULL,0,1+IFa3.finish为NULL,0,1
]开始
其中非a.id为空
a.id订购
步骤3:检查是否仍有要计算的条目
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
标准SQL
选择COUNT1仍然要迭代
来自'yourproject.yourdataset.yourtable`
其中start为NULL
如果此处的计数大于0–继续执行步骤2,依此类推,直到仍然为0
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
处理示例:
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
如果您手动执行这些步骤,您将得到以下结果
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
迭代1
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
迭代2
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
迭代3
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
迭代4
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
当然,对于更现实的情况,迭代次数可能会很高,即使仍然可以手动完成,也可能很快变得没有效率!
在这里,您可以使用自己选择的脚本或与一些bash/awk/等魔法一起编写上述逻辑
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
我希望通过运行一次查询来进行迭代。是否可以使用内联JS
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
下面是BigQuery标准SQL
它在一次运行中使用
这需要将整个表的数据传递到UDF中,因此UDF/
我怀疑这个解决方案是否有实际的实用价值,但从练习和BigQuery特性中肯定会发现有趣的前景
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
还要注意这里所做的一些假设,以简化JS代码并关注问题的根源。因此,假设是:所有id字段都是连续填充的,没有从值1开始的间隙。如果愿意,可以对此进行改进:o
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
标准SQL
创建临时函数yarr数组
返回数组
语言JSAS
var结果=[],fin;
对于i=0;iID NAME DURATION START FINISH P1 P2 P3
1 A 14 1
2 B 15 1
3 C 15 1
4 D 12 1
5 E 22 2 3
6 F 14 4 1
7 G 9 5 6
标准SQL
创建临时函数yarr数组
返回数组
语言JSAS
var结果=[],fin;
对于i=0;i