Google bigquery 在BigQuery中从Oracle SQL创建width_bucket函数

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

我希望用BigQuery中的一个新函数复制Oracle中可用的width_bucket函数。该函数根据在最小值和最大值之间指定的数字创建等宽桶。例如,width_bucketuser_count、0、35、10将创建10个相等的桶,如0-3.5、3.5-7等,并告诉您哪个桶用户_count属于哪个桶。任何帮助都将不胜感激

甲骨文文件-

这是我所拥有的,我相信这是可行的,但我想得到它,这样我就不必引用表(如果可能的话)来生成行号

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的工作方式。因此,请参见答案中的更新以处理此场景