Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 提高我的排名和中位数计算要求?_Mysql_Request_Ranking_Rank_Median - Fatal编程技术网

Mysql 提高我的排名和中位数计算要求?

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值进行排名,这些值可以被视

我必须在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子句的值使用的排名请求:

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

您的第二和第三个子查询似乎没有使用排名,只是计算记录并查找中间记录的计数。因此,看起来您不需要对这些子查询中的排名进行完整计算。非常感谢,这样更好: