所以我试图通过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
所以轴是:
我目前正在使用Oracle SQL CASE函数来确定支出是否属于存储桶,然后总结客户数量。然而,这是永远的,因为它有几个百万条记录。
如何有效地做到这一点?
谢谢!
答案 0 :(得分: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个桶。并且该功能为每个值分配一个桶号。您可以按此存储桶进行分组,并计算每个存储桶中有多少个reocrds。
演示here。
您甚至可以显示实际的铲斗范围。
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;
示例here。
答案 1 :(得分: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