Google bigquery 在BigQuery中从Oracle SQL创建width_bucket函数
我希望用BigQuery中的一个新函数复制Oracle中可用的width_bucket函数。该函数根据在最小值和最大值之间指定的数字创建等宽桶。例如,width_bucketuser_count、0、35、10将创建10个相等的桶,如0-3.5、3.5-7等,并告诉您哪个桶用户_count属于哪个桶。任何帮助都将不胜感激 甲骨文文件- 这是我所拥有的,我相信这是可行的,但我想得到它,这样我就不必引用表(如果可能的话)来生成行号Google bigquery 在BigQuery中从Oracle SQL创建width_bucket函数,google-bigquery,Google Bigquery,我希望用BigQuery中的一个新函数复制Oracle中可用的width_bucket函数。该函数根据在最小值和最大值之间指定的数字创建等宽桶。例如,width_bucketuser_count、0、35、10将创建10个相等的桶,如0-3.5、3.5-7等,并告诉您哪个桶用户_count属于哪个桶。任何帮助都将不胜感激 甲骨文文件- 这是我所拥有的,我相信这是可行的,但我想得到它,这样我就不必引用表(如果可能的话)来生成行号 CREATE OR REPLACE FUNCTION functio
CREATE OR REPLACE FUNCTION functions.widthBucket(
value NUMERIC,
minValue NUMERIC,
maxValue NUMERIC,
buckets INT64)
AS ((
SELECT resultBucket
FROM (
SELECT CASE
WHEN value >= (minValue * bucketNumber) + ((maxValue/buckets) * (bucketNumber - 1))
AND value < (maxValue/buckets) * bucketNumber
THEN bucketNumber
WHEN value = maxValue and bucketNumber = buckets
THEN bucketNumber
ELSE -1
END as resultBucket
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY '') as bucketNumber
FROM project.dateTable
) x
WHERE bucketNumber <= buckets) x
WHERE resultBucket != -1
));
下面是BigQuery标准SQL 试试下面——我想它完全符合你的要求
CREATE TEMP FUNCTION widthBucket(
value NUMERIC,
minValue NUMERIC,
maxValue NUMERIC,
buckets NUMERIC
) AS (
RANGE_BUCKET(value, GENERATE_ARRAY(minValue, maxValue, (maxValue - minValue)/buckets))
);
用法和你的问题一样简单
例如,widthBucketuser_计数为0、35、10
若要解决值等于maxValue时的边缘情况,请使用“上”的“下”变量
CREATE TEMP FUNCTION widthBucket(
value NUMERIC,
minValue NUMERIC,
maxValue NUMERIC,
buckets NUMERIC
) AS ((
SELECT IF(bucket > buckets, buckets, bucket)
FROM (
SELECT RANGE_BUCKET(value, GENERATE_ARRAY(minValue, maxValue, (maxValue - minValue)/buckets)) bucket
)
));
你能举个例子说明你打算如何使用这种UDF吗?用一些虚拟数据进行测试:o问,因为我似乎不明白这个表在函数中做了什么是的,它工作得很好,而且更干净。但有一个问题,如果将该值设置为maxValue,则结果是bucket+1。想法?当然。这种行为是有意义的,因为它是RANGE_BUCKET的工作方式。因此,请参见答案中的更新以处理此场景