Sql 基于数据创建范围

Sql 基于数据创建范围,sql,google-bigquery,Sql,Google Bigquery,我有不同价格的产品。我想看看在特定的价格范围内销售了多少产品。为此,我需要浏览数据,看看如何划分范围,然后得到该范围内的产品数量 数据如下所示- Product Price sold A 4.5 B 45.7 C 20 D 20.1 E 36.8 F 50 例如,对于上述数据,我看到最小值为

我有不同价格的产品。我想看看在特定的价格范围内销售了多少产品。为此,我需要浏览数据,看看如何划分范围,然后得到该范围内的产品数量

数据如下所示-

Product        Price sold
   A              4.5
   B              45.7
   C              20
   D              20.1
   E              36.8
   F              50
例如,对于上述数据,我看到最小值为4.5,最大值为50。因此,我决定将价格范围划分为-0-10美元、11-20美元、21-30美元、30-40美元、40-50美元$

所以,结果应该是这样的-

Range           No. of products sold
0-10                    1
11-20                   2
21-30                   0
30-40                   1
40-50                   2
价格浮动,因此,范围应考虑浮动值。这可能吗?

您可以使用生成数组。我想这样说:

select lb, lb + 10 as ub, count(d.product)
from unnest(generate_array(0, 50, 10)) lb left join
     data d
     on d.price >= lb and
        d.price < lb + 10
group by lb
order by lb;
您可以将下限和上限连接在一起,但将它们保留在两列中似乎很有用。

您可以使用generate\u array。我想这样说:

select lb, lb + 10 as ub, count(d.product)
from unnest(generate_array(0, 50, 10)) lb left join
     data d
     on d.price >= lb and
        d.price < lb + 10
group by lb
order by lb;

您可以将下限和上限连接在一起,但将它们放在两列中似乎很有用。

下面是针对BigQuery标准SQL的

#standardSQL
WITH price_ranges AS (
  SELECT '0-10' price_range UNION ALL 
  SELECT '11-20' UNION ALL 
  SELECT '21-30' UNION ALL 
  SELECT '30-40' UNION ALL 
  SELECT '40-50' 
)
SELECT price_range, COUNT(1) number_sold
FROM `project.dataset.table`
JOIN price_ranges 
ON CAST(price_sold AS INT64)
  BETWEEN CAST(SPLIT(price_range, '-')[OFFSET(0)] AS INT64) 
  AND CAST(SPLIT(price_range, '-')[OFFSET(1)] AS INT64)
GROUP BY price_range
-- ORDER BY price_range
如果要应用于您问题中的样本数据-结果为

Row price_range number_sold  
1   0-10        1    
2   11-20       2    
3   30-40       1    
4   40-50       2    

下面是BigQuery标准SQL

#standardSQL
WITH price_ranges AS (
  SELECT '0-10' price_range UNION ALL 
  SELECT '11-20' UNION ALL 
  SELECT '21-30' UNION ALL 
  SELECT '30-40' UNION ALL 
  SELECT '40-50' 
)
SELECT price_range, COUNT(1) number_sold
FROM `project.dataset.table`
JOIN price_ranges 
ON CAST(price_sold AS INT64)
  BETWEEN CAST(SPLIT(price_range, '-')[OFFSET(0)] AS INT64) 
  AND CAST(SPLIT(price_range, '-')[OFFSET(1)] AS INT64)
GROUP BY price_range
-- ORDER BY price_range
如果要应用于您问题中的样本数据-结果为

Row price_range number_sold  
1   0-10        1    
2   11-20       2    
3   30-40       1    
4   40-50       2    

目前的答案似乎都没有回答这个问题:当两个答案都假设范围为0-50时,如何生成范围

您似乎想要的是直方图,您可以在这里找到答案:

现在,如果您想在每个桶之间设置圆形台阶:

以数据为基础 从'fh-bigquery.public\u dump.gdp\u capital'中选择*` ,最小值和最大值为 选择MINgdp\u Capital min、MAXgdp\u Capital max 从数据 ,生成_bucket作为 选择x铲斗_min ,如果NullLeadX超额订购x,则1+从最小值和最大桶中选择最大值 从unnestu数组生成 根据您的起点,从最小值和最大值中选择0或0 ,从最小值和最大值中选择最大值 ,选择POW10,FHOFF.x.intLOG10max-min/10,从min_和_max log10中选择10个步骤的四舍五入顺序 x 挑选* 从生成存储桶 使用这些桶,您现在可以获得直方图:

选择桶最小值、桶最大值、计数*c 从生成存储桶 连接数据 关于data.gdp\u capital>=bucket\u min和data.gdp\u capital 选择*REPLACEIFNULLc,0作为c 从…起 选择桶最小值、桶最大值、计数*c 从生成存储桶 连接数据 在data.gdp\u capital>=bucket\u min和data.gdp\u capital目前的答案似乎都没有回答这个问题:当两个答案都假设范围为0-50时,如何生成范围

您似乎想要的是直方图,您可以在这里找到答案:

现在,如果您想在每个桶之间设置圆形台阶:

以数据为基础 从'fh-bigquery.public\u dump.gdp\u capital'中选择*` ,最小值和最大值为 选择MINgdp\u Capital min、MAXgdp\u Capital max 从数据 ,生成_bucket作为 选择x铲斗_min ,如果NullLeadX超额订购x,则1+从最小值和最大桶中选择最大值 从unnestu数组生成 根据您的起点,从最小值和最大值中选择0或0 ,从最小值和最大值中选择最大值 ,选择POW10,FHOFF.x.intLOG10max-min/10,从min_和_max log10中选择10个步骤的四舍五入顺序 x 挑选* 从生成存储桶 使用这些桶,您现在可以获得直方图:

选择桶最小值、桶最大值、计数*c 从生成存储桶 连接数据 关于data.gdp\u capital>=bucket\u min和data.gdp\u capital 选择*REPLACEIFNULLc,0作为c 从…起 选择桶最小值、桶最大值、计数*c 从生成存储桶 连接数据 在data.gdp\u capital>=bucket\u min和data.gdp\u capital由于两个答案都假设范围为0-50-这是不正确的。至少在我的答案中,你可以在内联或查找表中设置/设置任何范围,我的意思是——这两个答案都在代码桶中固定了范围。我想添加一个答案,根据特定数据选择自己的范围。用户似乎对当前接受的答案很满意:当然,我仍然不知道我的答案中的范围是如何固定的-我认为它非常通用,允许使用任何范围:oI的意思是固定的,因为用户必须键入用户想要使用的任何范围。但是问题的标题是基于数据创建范围,所以我想回答如何基于表格中的数据创建范围。哦,我现在明白你的意思了:oas两个答案都假设范围为0-50-这是不正确的。至少在我的答案中,你可以在内联或查找表中设置/设置任何范围,我的意思是——这两个答案都在代码桶中固定了范围。我想添加一个答案,根据特定数据选择自己的范围。用户似乎对当前被接受的答案很满意:当然,我仍然很满意
在我的回答中,我看不出范围是如何固定的——我认为它非常通用,允许使用任何范围:oI的意思是固定的,因为在用户中,必须键入用户想要使用的任何范围。但是问题的标题是基于数据创建范围,所以我想回答如何基于表格中的数据创建范围。哦,我现在明白你的意思了:o