我希望我把这个问题说得对,我已经有很长一段时间了,现在正在寻找不同的方法,我有一个应用程序,用于调查用户他们认为适合商品的价格然后从应用程序出现基于most common
到near common prices
的平均价格,平均问题就出现了一个可以找到这些价格的查询,所以我的表格样本:
|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 price
为500000
,但我们的506980
和450000
价格也为near the common price
,因此我们希望它为500000, 500000, 450000 and 506980
{1}}我个人并不熟悉MySQL,任何帮助解决这个问题都将受到赞赏。
答案 0 :(得分:2)
您在寻找完全基于MySQL的解决方案吗?正如评论中所提到的,你应该更明确地定义“近”。在下面的示例中,我调用了平均值“{near”值的1 Std Deviation内的任何值。
此外,如果有超过1个最常见的价格,你会怎么做?在不知道您的要求的细节的情况下,我可能建议采用一种方法,通过将平均值作为起点而不是模式来完全绕过该问题。或者,您可以使用@Override
public int compare(Point o1, Point o2) {
BigDecimal d1 = getDistance(o1);
BigDecimal d2 = getDistance(o2);
return d1.compareTo(d2);
}
函数尝试获取模式,然后使用平均值(如果失败)。
这是一个基于值聚类输出值的示例,并避免必须处理与模式相关的奇怪边缘情况。
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);
子句中的表达式,以更改“近”值边界的定义方式。
答案 1 :(得分: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
当然,您需要对其进行修改,以满足您的确切需求和数据格式,但希望这是一个开始。