【发布时间】:2014-01-15 11:19:27
【问题描述】:
我必须在 mysql 表上实现多重排名和中位数计算。 表格如下:
ps_eur_agreg_lots(id_lot、id_customer、variete、qualite_presentation、defauts_graves)
(其实就是很多表的聚合视图。)
id_customer 和 variete 用于过滤带有不断变化的 where 子句的子集(例如:WHERE id_customer=5 和 variete=agata,从表单生成),我将根据 qualite_presentation 和 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_lot, qrank),我将加入 ps_eur_aggr_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)
)
这个请求完成了这项工作,但使用树乘以相同的排名请求,在我看来很难看。
这种中位数计算的想法是取两个(或一个)中心值(偶数或奇数)的平均值。 我尝试使用临时排名表,但出现“无法重新打开表”错误。
我想我可以将请求拆分为一些中间请求,但看不到真正令人满意的方式。欢迎提出想法。
【问题讨论】:
-
您的第二个和第三个子查询似乎没有使用排名,只是计算记录并找到中间记录的计数。因此,您似乎不需要对这些子查询中的排名进行完整计算。
标签: mysql request ranking rank median