2013-08-07 51 views
4

因此,我試圖通過SQL查詢從Oracle SQL表中的數據創建概率密度函數。因此,考慮下表:Oracle SQL從數據創建PDF

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

現在,如果我要創建這些數據,我需要計算每個客戶花費在一定的量子(介於0和50或50至100的次數的PDF )。一個例子圖會是這個樣子(原諒我的ASCII藝術差):

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

所以軸線是:

  • X軸:是鬥
  • Y軸:是客戶

我目前正在使用Oracle SQL CASE功能,以確定是否支出落在桶中,然後求和NU數大部分的客戶都這麼做。然而,這是永恆的,因爲它有幾個0000記錄

有關如何有效地做到這一點的任何想法?

謝謝!

回答

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個桶。該函數爲每個值分配一個桶號。你可以按這個桶分組,並計算每個桶中有多少個響應。

演示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

+0

您先生是一個傳奇!非常感謝我正在尋找的東西。 – Rabid

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