【问题标题】:improving my ranking and median calculation mysql request?提高我的排名和中位数计算 mysql 请求?
【发布时间】: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


【解决方案1】:

消除第 2 和第 3 的排名,而是对一对联合的简单子查询使用连接

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

【讨论】:

  • 非常感谢,这样好多了:)
猜你喜欢
  • 2010-11-06
  • 2014-07-04
  • 2013-04-03
  • 2011-06-18
  • 1970-01-01
  • 2013-01-28
  • 2022-01-18
  • 2021-10-15
  • 2014-02-22
相关资源
最近更新 更多