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 の間) で費やした回数をカウントする必要があります。グラフの例は次のようになります (下手なアスキー アートを許してください)。

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 に答える