2016-12-29 13 views
0

私は質問を正しく表現することを願っています。これまでかなり異なるアプローチを探していました。商品はそこからアプリがnear common pricesからmost commonに基づく平均価格を思い付くとしている彼らが、問題は、これらの価格を見つけることができますクエリを考え出すされて平均化するので、私のテーブルのサンプル:最も一般的なものとその近隣の番号を見つけるためのmysqlクエリ

|id |commodityFk|price |dateCreated  | 
-------------------------------------------- 
|1 |1   |1200 |2016-12-24 22:30:30| 
|2 |1   |500000|2016-12-24 22:30:30| 
|3 |1   |500000|2016-12-24 22:30:30| 
|4 |1   |450000|2016-12-24 22:30:30| 
|5 |1   |506980|2016-12-24 23:15:12| 
|6 |1   |2000 |2016-12-25 23:57:06| 

したがって、この表からmost common price500000ですが、である506980450000のような価格もあります。それは平均的に500000, 500000, 450000 and 506980になると期待しています。私はこの問題を解決するための助けに感謝します。

+0

'near 'の値には許容範囲がありますか? – SAVAFA

+0

私はすべての数字の基数を見つけていましたが、どの数字の数字が多いかを数え、その数字のすべてを平均していましたが、どんな数値も大きいです –

+1

「最も一般的な価格」が1つ以上あるとどうなりますか?すべての価格が正確に1回発生すればどうなるでしょうか? – GentlemanMax

答えて

2

完全にMySQLベースのソリューションをお探しですか?コメントに記載されているように、実際には「近く」をより明示的に定義する必要があります。下の例では、私は平均値の1 Std Deviationの範囲内の任意の値を "近い"値と呼んでいます。

さらに、最も一般的な価格が1つ以上ある場合はどうしますか?要件の詳細を知らなくても、モードではなく平均を開始点として使用することで、その問題を完全に回避する方法を提案することがあります。あるいは、COALESCE()関数を使用してモードを取得し、それが失敗した場合に平均を使用することができます。

ここでは、値のクラスタリングに基づいて値を出力し、奇妙なモードに関連するエッジケースに対処する必要がないような例を示します。

SELECT AVG(price) FROM prices 
    JOIN (SELECT AVG(price) as rawAverage, STD(price) as deviation FROM prices) stats 
    WHERE commodityFk = 1 
    AND price BETWEEN 
    (rawAverage - deviation) AND (rawAverage + deviation); 

これは明らかに単なる出発点ですが、かなりスケーラブルです。 JOIN句の式を簡単に変更して、 "近い"値の境界がどのように定義されるかを変更できます。

+0

うわー、ちょうど私が一行の質問で一週間のうちにやったことがなかったのです。 –

1

SQLから完全価格リストを返し、価格リストを分析して「一般価格に近い価格」を決定するPHP関数を作成すると便利です。

これにより、条件を簡単に調整できます。あなたがしなければ次に

function findPricesNearCommonPrice($data) 
{ 
    $pricesNearCommonPrice = Array(); 

    // find most common price 
    $countOfEachValue = array_count_values($data); 
    $mostCommonPrice = array_search(max($countOfEachValue), $countOfEachValue); // doesn't account for items that occur the same number of times, but you could make it do that :-) 
    echo "Most Common Price: " . $mostCommonPrice . "<br><br>"; 

    $tolerance = .15; // 15% 

    $minNearPrice = $mostCommonPrice * (1 - $tolerance); 
    $maxNearPrice = $mostCommonPrice * (1 + $tolerance); 

    foreach ($data as $p) { 
     if ($p > $minNearPrice && $p < $maxNearPrice) { 
      $pricesNearCommonPrice[] = $p; 
     } 
    } 

    return $pricesNearCommonPrice; 
} 

は、おそらくこのような何かはあなたのためのスタートとなり

$data = Array(500000, 500000, 450000, 506980, 2000); 

$values = findPricesNearCommonPrice($data); 
$average = array_sum($values)/count($values); 

echo "Prices near the most common price:<br>"; 
echo implode(", ",$values); 

echo "<br><br>"; 
echo "Average: " . $average; 

あなたが得る:

Most Common Price: 500000 

Prices near the most common price: 
500000, 500000, 450000, 506980 

Average: 489245 

もちろん、あなたが必要ですデータの正確なニーズやフォーマットに合わせて変更することができますが、うまくいけばそれが始まりです。

+0

私はこれが大好きです。本当によかったです。 –

関連する問題