我有一个专栏 grams
在table上 info
它可以是任何正整数。另外,我还有一张table map
它有两列 price
以及 grams
,其中gram可以取一些谨慎的值(比如说50),并按升序排列。
我想在表中添加一列 info
命名 cost
通过抓取 price
从表 map
以至于 info.grams
<= map.grams
(最小)。换言之,我想把我的梦想变成现实 info.grams
基于 map.grams
并获取 price
.
我知道什么?
我可以用 CASE WHEN
使变硬 info.grams
像下面这样,然后连接两个表并获取 price
. 但是,由于谨慎的值是不受限制的,我想找到一个干净的方法来做它,而不会使我的查询一团糟。
CASE WHEN grams<=1 THEN 1
WHEN grams<=5 THEN 5
WHEN grams<=10 THEN 10
WHEN grams<=20 THEN 20
WHEN grams<=30 THEN 30
...
3条答案
按热度按时间enxuqcxy1#
下面是bigquery标准sql
您可以使用range\ U bucket函数进行此操作
您可以使用下面的示例中的示例数据来测试上面的播放
有结果的
yqkkidmi2#
哦,使用标准sql来实现这一点是很好的
lead()
以及join
:然而,bigquery的一个限制是它不支持非等外联接。所以,你可以把
map
表到数组并使用unnest()
做你想做的事:olqngx593#
除了戈登的米哈伊尔的答案。我想建议第三种选择,使用first\u value(),它是bigquery中的一个内置方法,并使用window的知识。
从原理出发,如果我们在info和map表之间使用left join,分别使用grams作为主键,那么对于map表中没有指定的每个gram,我们都会有null值。出于这个原因,我们将使用这个表(带有空值)来用下一个可用的价格对所有的克进行定价。为了实现这一点,我们将使用first\ u value()。根据文件:
返回当前窗口框架中第一行的值表达式的值。
因此,我们将为price为null的每一行选择当前行和下一个非值行之间的第一个非null值。语法如下:
以及输出,
最后一个select语句执行我们上面描述的操作。此外,我想指出:
UNBOUNDED FOLLOWING
:窗框在分区的末端结束。和
CURRENT ROW
:窗口框架从当前行开始。