Mysql 需要找到三条平均成本最高的路径,代码为“A”,将于2021年5月交付
声明: 需要在2021年5月交付的表“A”中平均找到三条从_到_u的最昂贵路径吗?如果有两条领带,则包括两条领带 模式:Mysql 需要找到三条平均成本最高的路径,代码为“A”,将于2021年5月交付,mysql,sql,Mysql,Sql,声明: 需要在2021年5月交付的表“A”中平均找到三条从_到_u的最昂贵路径吗?如果有两条领带,则包括两条领带 模式: 'observed_on', date, 'from_', varchar(3), 'to_', varchar(3), 'from_to_', varchar(8), 'with_', varchar(3), 'cart_no', varchar(8), 'deliver_on', date, 'd_charge', double, 样本数据: 我尝试过的解决方案: S
'observed_on', date,
'from_', varchar(3),
'to_', varchar(3),
'from_to_', varchar(8),
'with_', varchar(3),
'cart_no', varchar(8),
'deliver_on', date,
'd_charge', double,
样本数据:
我尝试过的解决方案:
SELECT
from_to_
,avg_price
FROM
(
SELECT
from_to_
,ROUND(AVG(d_charge),2) AS avg_price
,DENSE_RANK() OVER(ORDER BY ROUND(AVG(d_charge),2) DESC) rank_by_avgp
FROM
(
SELECT
*
FROM DELIVERY
WHERE deliver_on BETWEEN '2021-05-01' AND '2021-05-30'
AND with_ = 'A'
) AS A
GROUP BY from_to_
) AS bb
WHERE bb.rank_by_avgp <=3;
我知道这是一个解决办法,所以我正在寻找一个更好的解决方案@nishant,您的问题问得很糟糕 你的问题有哪些问题 您引用的样本数据是一张图片?为什么不给文本值或者更好的DML语句来设置示例呢。 在参考数据集图片中,所有DELIVERY.deliver_on date值均在2010年之前。因此,您在“2021-05-01”和“2021-05-30”之间提供的条件不会返回任何示例数据。 如果你说 我知道这是一个解决办法,所以我正在寻找更好的解决方案 那么基于什么?这是解决什么问题的办法?它看起来产生了正确的结果,那么它有什么问题呢?你想让它表现得更好还是怎么样 您没有指定数据库版本。不同的MySQL版本可以有不同的解决方案。 一个可能的解决办法 示例数据集设置: DDL DML 查询
这里与您的解决方案唯一的主要区别是,这里我不使用agggate组,只使用分析函数。我更喜欢这种方式,因为它允许稍后在查询中携带其他属性,而无需对其应用聚合函数等。但最终,这取决于性能和要求应该做什么/如何做。请提供示例数据和所需结果。请参阅:
CREATE TABLE DELIVERY (
observed_on DATE
, from_ VARCHAR(3)
, to_ VARCHAR(3)
, from_to_ VARCHAR(8)
, with_ VARCHAR(3)
, cart_no VARCHAR(8)
, deliver_on DATE
, d_charge DOUBLE
);
INSERT INTO DELIVERY VALUES ('2012-01-19','Aus','Nzl','AusNzl','A','2118','2021-04-19',82.3);
INSERT INTO DELIVERY VALUES ('2012-01-19','Aus','Nzl','AusNzl','A','2118','2021-05-19',82.3);
INSERT INTO DELIVERY VALUES ('2012-01-19','Aus','Nzl','AusNzl','A','2118','2021-05-19',82.3);
INSERT INTO DELIVERY VALUES ('2013-01-19','Ind','Sla','IndSla','B','2233','2021-05-19',70.32);
INSERT INTO DELIVERY VALUES ('2013-01-19','Ind','Sla','IndSla','A','2233','2021-05-19',70.32);
INSERT INTO DELIVERY VALUES ('2013-01-19','Eur','Usa','EurUsa','C','2434','2021-05-19',67.53);
INSERT INTO DELIVERY VALUES ('2013-01-19','Eur','Usa','EurUsa','A','2434','2021-05-19',67.53);
INSERT INTO DELIVERY VALUES ('2013-01-19','Xyz','Usa','XyzUsa','A','2434','2021-05-19',67.53);
INSERT INTO DELIVERY VALUES ('2013-01-19','Xyz','Sla','XyzSla','A','2434','2021-05-19',67.51);
INSERT INTO DELIVERY VALUES ('2012-01-19','Aus','Nzl','AusNzl','A','2323','2021-05-19',82.3);
INSERT INTO DELIVERY VALUES ('2012-01-19','Aus','Nzl','AusNzl','A','2118','2021-06-19',82.3);
SELECT from_to_
, avg_d_charge
, denserank_avg_d_charge
FROM /*SUB_to_calculate_the_denserank*/
(
SELECT from_to_
, ROUND(avg_d_charge, 2) AS avg_d_charge
, DENSE_RANK() OVER (
ORDER BY ROUND(avg_d_charge, 2) DESC
) denserank_avg_d_charge /*dense ranking*/
FROM /*SUB_to_calculate_the_averages*/
(
SELECT from_to_
, ROW_NUMBER() OVER (PARTITION BY from_to_) AS rownumber /*To filter for only one row per from_to_.*/
, AVG(d_charge) OVER (PARTITION BY from_to_) AS avg_d_charge /*Average caldulation*/
FROM /*DELIVERY*/
DELIVERY
WHERE 1 = 1
AND with_ = 'A' /* The "code" filter*/
AND DATE_SUB(deliver_on, INTERVAL DAYOFMONTH(deliver_on) - 1 DAY) = '2021-05-01' /* The 2021-05 filter*/
) SUB_to_calculate_the_averages
WHERE 1 = 1
AND rownumber = 1
) SUB_to_calculate_the_denserank
WHERE 1 = 1
AND denserank_avg_d_charge < 4;