MySQL选择最常发生或平均值
我有一个MySQL表,我想从中选择: 1) “最常发生”值(如果存在任何普遍值) 2) 或“平均”值,如果没有最常出现的值 示例表1:MySQL选择最常发生或平均值,mysql,Mysql,我有一个MySQL表,我想从中选择: 1) “最常发生”值(如果存在任何普遍值) 2) 或“平均”值,如果没有最常出现的值 示例表1: value 1 2 3 4 所有的值都是相等的,因此我想取AVG(`value`) 示例表2: value 1 2 2 3 值2占优势,因此我想选择值2 什么样的mysql查询可以做到这一点?以下方法计算这两个值,然后在它们之间进行选择: select (case when numcnts = 1 then avgvalue else topvalue en
value
1
2
3
4
所有的值都是相等的,因此我想取AVG(`value`)
示例表2:
value
1
2
2
3
值2
占优势,因此我想选择值2
什么样的mysql查询可以做到这一点?以下方法计算这两个值,然后在它们之间进行选择:
select (case when numcnts = 1 then avgvalue else topvalue end)
from (select avg(value) as avgvalue from t) cross join
(select value as topvalue from t group by value order by count(*) desc limit 1) cross join
(select count(distinct cnt) as numcnts from (select count(*) as cnt from t group by value))
注意:如果顶部有领带,但也有其他值,则返回任意值。在这种情况下,您没有指定要执行的操作
此外,SQL未经测试,因此可能存在语法错误。以下方法计算这两个值,然后在其中进行选择:
select (case when numcnts = 1 then avgvalue else topvalue end)
from (select avg(value) as avgvalue from t) cross join
(select value as topvalue from t group by value order by count(*) desc limit 1) cross join
(select count(distinct cnt) as numcnts from (select count(*) as cnt from t group by value))
注意:如果顶部有领带,但也有其他值,则返回任意值。在这种情况下,您没有指定要执行的操作
此外,SQL未经测试,因此可能存在语法错误。从Gordon的答案开始,我在SQL Fiddle中测试并更正了SQL查询:
SELECT IF(t4.numcnts = 1, t1.avgvalue, t2.topvalue) AS result
FROM (select avg(value) as avgvalue from test) t1
CROSS JOIN (select value as topvalue from test group by value order by count(*) desc limit 1) t2
CROSS JOIN join (select count(distinct cnt) as numcnts from
(select count(*) as cnt from test group by value) t3) t4
这里是两个测试表的摆弄(切换test2进行测试,以便在特定值占优势时查看结果):
我的更改是在
SELECT
子句中使用IF
而不是CASE
语句,并为子选择添加必要的表别名。从Gordon的答案开始,我在SQL Fiddle中测试并更正了SQL查询:
SELECT IF(t4.numcnts = 1, t1.avgvalue, t2.topvalue) AS result
FROM (select avg(value) as avgvalue from test) t1
CROSS JOIN (select value as topvalue from test group by value order by count(*) desc limit 1) t2
CROSS JOIN join (select count(distinct cnt) as numcnts from
(select count(*) as cnt from test group by value) t3) t4
这里是两个测试表的摆弄(切换test2进行测试,以便在特定值占优势时查看结果):
我的更改是在
SELECT
子句中使用IF
而不是CASE
语句,并为子选择添加必要的表别名。我无法这样做。我可以用PHP来做,我知道它背后的想法。选择计数(value
),按value
I获取计数分组。如果最大计数为1,则选择平均值,否则选择最大值。我不太了解MySQL语法,无法将其作为一个查询来编写。我无法做到这一点。我可以用PHP来做,我知道它背后的想法。选择计数(value
),按value
I获取计数分组。如果最大计数为1,则选择平均值,否则选择最大值。我不太了解MySQL语法,无法将其作为1个查询来编写。