2015-06-08 43 views
3

我得到使用這樣的查詢數據:計算十分位數/從陣列昆泰使用PHP/MySQL的

SELECT `product_name`, `Number of Cases` FROM `myTable` where `color` = 'red' order by `Number of Cases` DESC"; 

我回來的數組這樣的,如果我var_dump

array(2) { 
[0]=> array(4) { ["product_name"]=> string(5) "23418" [0]=> string(5) "23418" ["Number of Cases"]=> string(3) "434" [1]=> string(3) "434" } 
[1]=> array(4) { ["product_name"]=> string(5) "79746" [0]=> string(5) "79746" ["Number of Cases"]=> string(3) "372" [1]=> string(3) "372" } 
} 

的上面是一個例子,但顯然,我在真正的表中有更多的行。

這裏就是我希望做......

獲取「件數」的所有值,並將其打入五分之一(5桶數目相等值的每一個「桶」)或十分位(每個「桶」中具有相同數量值的10個桶)。我需要爲每個五分位數或十分位數返回最高值(對於「個案數」)。

我看到的流動是這樣的:

  • 順序從「件數」的值的
  • 計數數(行)中的值返回
  • 劃分成相等的「桶」(例如,如果有100行回來,我需要十分位數{10個等於桶},然後每個桶將有10行。
  • 獲取/在每個桶返回最高值的值

我知道這些步驟,但我無法將它們轉化爲有效的PHP。

任何見解都會有所幫助。

謝謝。

回答

1

您可以使用變量將一列tile列添加到MySQL中的數據中。下面是兩個昆泰公司和十分位數的例子:

SELECT t.*, 
     floor((seqnum - 1) * 5/@rn) as tile_5, 
     floor((seqnum - 1) * 10/@rn) as tile_10 
FROM (SELECT `product_name`, `Number of Cases`, (@rn := @rn + 1) as seqnum 
     FROM `myTable` CROSS JOIN 
      (SELECT @rn := 0) params 
     WHERE `color` = 'red' 
     ORDER BY `Number of Cases` DESC 
    ) t 

編輯:

以上應該工作,但也許一些時髦與@rn發生。如果是這樣的:

SELECT t.*, 
     floor((seqnum - 1) * 5/x.cnt) as tile_5, 
     floor((seqnum - 1) * 10/x.cnt) as tile_10 
FROM (SELECT `product_name`, `Number of Cases`, (@rn := @rn + 1) as seqnum 
     FROM `myTable` CROSS JOIN 
      (SELECT @rn := 0) params 
     WHERE `color` = 'red' 
     ORDER BY `Number of Cases` DESC 
    ) t CROSS JOIN 
    (SELECT COUNT(*) as cnt FROM myTable WHERE color = 'red') x; 
+0

瞭解的東西新的每一天! +1! – Darren

+0

這給了我'seqnum'正確,但'tile_5'和'tile_10'爲每行0。 – jonmrich

+0

我不明白這是怎麼發生的。'@ rn'應該是表中與條件匹配的行數。表達式'(seqnum - 1)* 5/@ rn'應該產生並且在0和小於5之間的值。然後'floor()'應該取其整數部分。 –

0

我結束了這樣的事情對我的查詢,這是相當快,即使在一個體面的表:

SELECT 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(`number of cases` ORDER BY `number of cases`SEPARATOR ','), 
',', 20/100 * COUNT(*) + 1), ',', -1) AS DECIMAL) AS `20th`, 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(`number of cases` ORDER BY `number of cases`SEPARATOR ','), 
',', 40/100 * COUNT(*) + 1), ',', -1) AS DECIMAL) AS `40th`, 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(`number of cases` ORDER BY `number of cases`SEPARATOR ','), 
',', 60/100 * COUNT(*) + 1), ',', -1) AS DECIMAL) AS `60th`, 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(`number of cases` ORDER BY `number of cases` SEPARATOR ','), 
',', 80/100 * COUNT(*) + 1), ',', -1) AS DECIMAL) AS `80th` 
FROM `myTable` where `color`="red" 

本示例在20%的回報率4個數字, 40%,60%,80%百分點。這四個數字是特定百分位數行的值(number of cases)。

請注意,您可能將不得不增加你group_concat_max_len爲了這個工作......是這樣的:

$sessiont = 'SET SESSION group_concat_max_len = 10485760;'; 
$fixed = $dbh->query($sessiont); 

帽尖到這個博客的解決方案:http://web.performancerasta.com/metrics-tips-calculating-95th-99th-or-any-percentile-with-single-mysql-query/