4

因此,我试图通过 SQL 查询从 Oracle SQL 表中的数据创建概率密度函数。所以考虑下表:

Name  |  Spend
--------------
Anne  |  110
Phil  |  40
Sue   |  99
Jeff  |  190
Stan  |  80
Joe   |  90
Ben   |  100
Lee   |  85

现在,如果我想从该数据创建 PDF,我需要计算每个客户在特定数量(0 到 50 之间或 50 到 100 之间)中花费的次数。一个示例图看起来像这样(原谅我可怜的 ascii 艺术):

5|
4|  *
3|  * 
2|  * *
1|* * * *
 |_ _ _ _ 
  5 1 1 2 
  0 0 5 0 
    0 0 0

所以轴是:

  • X 轴:是桶
  • Y轴:是客户数量

我目前正在使用 Oracle SQL CASE 函数来确定支出是否在桶内,然后将这样做的客户数量相加。然而,这是永远的,因为它有几百万条记录

关于如何有效地做到这一点的任何想法?

谢谢!

4

2 回答 2

4

您可以尝试使用WIDTH_BUCKET函数。

select bucket , count(name) 
  from (select name, spend,
               WIDTH_BUCKET(spend, 0, 200, 4) bucket
          from mytable
       )
group by bucket
order by bucket;

在这里,我将 0 到 200 的范围划分为 4 个桶。该函数为每个值分配一个桶号。您可以按此存储桶分组并计算每个存储桶中有多少记录。

演示在这里

您甚至可以显示实际的存储桶范围。

select bucket,
       cast(min_value + ((bucket-1) * (max_value-min_value)/buckets) as varchar2(10))
       ||'-'
       ||cast(min_value + ((bucket) * (max_value-min_value)/buckets) as varchar2(10)),
       count(name) c 
  from (select name,
               spend,
               WIDTH_BUCKET(spend, min_value, max_value, buckets) bucket
          from mytable)
 group by bucket
 order by bucket;

样品在这里

于 2013-08-07T09:25:44.647 回答
0
SELECT COUNT(*) y_axis,
     X_AXIS
FROM
     (SELECT COUNT(*)y_axis,
          CASE
               WHEN spend <= 50 THEN 50
               WHEN spend < 100 AND spend > 50 THEN 100 
               WHEN spend  < 150 AND spend >= 100 THEN 150
               WHEN spend  < 200 AND spend >= 150 THEN 200
          END x_axis
     FROM your_table
     GROUP BY spend
     )
GROUP BY X_AXIS;

    y_axis x_axis
-----------------
    4   100
    1   50
    1   200
    2   150
于 2013-08-07T09:22:29.850 回答