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来计算时间表的开始和完成时间。
注意:活动的计划数量可能会有所不同
p1、p2和p3是行活动的前置ID
一个活动只能有一个前置任务或多个前置任务
开始列和结束列的计算如下
起始值等于“2017-01-01”的较大值或(最大值(前一个的结束值+1))
完成总是一个开始+持续时间-1的函数
在得到答案之前,计算应该是递归的。
我在bigquery中需要它的原因是通过改变duration值的迭代来执行调度的模拟。
对上述时间表的答复如下:
ID NAME DURATION START FINISH P1 P2 P3
1 A 14 1-Jan-17 14-Jan-17 1
2 B 15 15-Jan-17 29-Jan-17 1
3 C 15 15-Jan-17 29-Jan-17 1
4 D 12 15-Jan-17 26-Jan-17 1
5 E 22 30-Jan-17 20-Feb-17 2 3
6 F 14 27-Jan-17 9-Feb-17 4 1
7 G 9 21-Feb-17 1-Mar-17 5 6
4条答案
按热度按时间aor9mmx11#
bigquery不支持递归查询
因此,您需要通过自己的使用来编排递归性
client
你的选择下面演示如何通过运行一系列查询直到解决所有依赖关系来实现这一点
第一步:准备初始表格-
yourproject.yourdataset.yourtable
(从你的问题中举一个简单的例子)步骤2:使用与源表相同的目标表运行迭代查询-
yourproject.yourdataset.yourtable
使用写入首选项>>覆盖表第三步:检查是否还有要计算的条目
如果这里的count大于0–继续执行步骤2,依此类推,直到仍然\u to \u iterate=0
处理示例:
如果您手动执行这些步骤-下面是您得到的
迭代1
迭代2
迭代3
迭代4
当然,对于更现实的情况-迭代次数可能会很高,即使仍然可以手动完成,也可能会很快变得没有效率!
在这里,您可以使用
client
由你选择还是bq command line
还有一些bash/awk/等魔法ilmyapht2#
对脚本和存储过程的支持现在处于测试阶段(截至2019年10月)
您可以提交多个用分号分隔的语句,bigquery现在可以运行它们了。
我希望通过运行一次查询来进行迭代
因此,现在您可以将所需的逻辑实现为一个纯sql脚本(不涉及js-udf,也不需要手动迭代),如下面的示例所示
上面的脚本最后执行12个作业—一个父作业和11个子作业
如果您将检查最终作业的结果-您将看到结果表
ha5z0ras3#
我希望通过运行一次查询来进行迭代。是否可以使用内联js?
下面是bigquery标准sql
它在一次运行中使用
JS UDF
这需要将整个表的数据传递到udf中,因此udf的主题是明确的limits
/limitations
我怀疑这个解决方案是否有真正的实用价值,但从练习和bigquery特性中肯定会很有趣还要注意这里所做的一些假设,以简化js代码并关注问题的根源。因此,假设是:所有id字段都是连续填充的,没有从值1开始的间隙(如果您愿意,可以对此进行改进:o))
你可以用下面的虚拟数据(来自你的问题)测试/玩上面的
结果是
f0ofjuux4#