Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Mysql bigquery SQL用于计算项目计划的开始和完成时间_Mysql_Sql_Google Bigquery - Fatal编程技术网

Mysql bigquery SQL用于计算项目计划的开始和完成时间

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

需要开发一个递归的大查询SQL来计算时间表的开始和完成时间。 注意:活动的计划数量可能会有所不同 P1、P2和P3是行活动的前置ID 一个活动只能有一个前置或多个前置 开始和结束列的计算如下所示 起始值等于2017-01-01的较大值或其前身的最大完工值+1 完成始终是开始+持续时间-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   
我在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;i
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;i