Mysql 提高我的排名和中位数计算要求?
我必须在mysql表上实现多重排名和中值计算。 该表如下所示: ps\U eur\U agreg\U lots id\U lot、id\U customer、品种、质量演示、defauts\U graves 事实上,它是来自许多表的聚合视图 id_customer和variete用于过滤带有变化where子句的子集,例如:where id_customer=5和variete=agata,生成自一个表单,我将在该表单上对qualite_表示和defauts_graves值进行排名,这些值可以被视为标记,并计算我的子集上这些标记的中值 下面是我对带有where子句的值使用的排名请求:Mysql 提高我的排名和中位数计算要求?,mysql,request,ranking,rank,median,Mysql,Request,Ranking,Rank,Median,我必须在mysql表上实现多重排名和中值计算。 该表如下所示: ps\U eur\U agreg\U lots id\U lot、id\U customer、品种、质量演示、defauts\U graves 事实上,它是来自许多表的聚合视图 id_customer和variete用于过滤带有变化where子句的子集,例如:where id_customer=5和variete=agata,生成自一个表单,我将在该表单上对qualite_表示和defauts_graves值进行排名,这些值可以被视
SELECT id_lot,@curQRank := @curQRank+1 as qrank
FROM ps_eur_agreg_lots, (SELECT @curQRank :=0) r
WHERE variete='agata'
ORDER BY qualite_presentation DESC, prc_total_def ASC)
as tqrank
这将返回一个排名关系id\u lot,qrank,我将加入ps\u eur\u aggr\u lots
要获得排名关系,可将其用于多个标准
以下是我获得的计算中值的请求:
SELECT AVG(al.qualite_presentation) as median
FROM ps_eur_agreg_lots al
JOIN
(SELECT id_lot,@curQRank := @curQRank+1 as qrank
FROM ps_eur_agreg_lots, (SELECT @curQRank :=0) r
WHERE variete='agata'
ORDER BY qualite_presentation DESC, prc_total_def ASC)
as tqrank
ON al.id_lot=tqrank.id_lot
WHERE tqrank.qrank in (
(SELECT
round((count(*)+1)/2,0) as qm1ind
FROM
(SELECT id_lot,@curQRank := @curQRank+1 as qrank
FROM ps_eur_agreg_lots, (SELECT @curQRank :=0) r
WHERE variete='agata'
ORDER BY qualite_presentation DESC, prc_total_def ASC
) as tqrank) ,
(SELECT
round((count(*)+2)/2,0) as qm2ind
FROM
(SELECT id_lot,@curQRank := @curQRank+1 as qrank
FROM ps_eur_agreg_lots, (SELECT @curQRank :=0) r
WHERE variete='agata'
ORDER BY qualite_presentation DESC, prc_total_def ASC
) as tqrank)
)
这个请求完成了任务,但是使用了树乘以相同的排名请求,在我看来很难看
这种中位数计算的思想是取两个或一个中心值的平均值,在偶数或奇数情况下。
我尝试使用临时排名表,但我得到了无法重新打开表错误
我想我可以把请求分成一些中间的请求,但看不到真正令人满意的方式。欢迎想法。取消第二和第三排名,而是对一对联合的简单子查询使用联接
SELECT AVG(al.qualite_presentation) as median
FROM ps_eur_agreg_lots al
JOIN
(
SELECT id_lot,@curQRank := @curQRank+1 as qrank
FROM ps_eur_agreg_lots, (SELECT @curQRank :=0) r
WHERE variete='agata'
ORDER BY qualite_presentation DESC, prc_total_def ASC
) as tqrank
ON al.id_lot=tqrank.id_lot
INNER JOIN
(
SELECT round((count(*)+1)/2,0) as qm1ind
FROM ps_eur_agreg_lots
WHERE variete='agata'
UNION
SELECT round((count(*)+2)/2,0) as qm1ind
FROM ps_eur_agreg_lots
WHERE variete='agata'
) tqrank2
ON tqrank.qrank = tqrank2.qm1ind
GROUP BY qualite_presentation
您的第二和第三个子查询似乎没有使用排名,只是计算记录并查找中间记录的计数。因此,看起来您不需要对这些子查询中的排名进行完整计算。非常感谢,这样更好: