Mysql 需要找到三条平均成本最高的路径,代码为“A”,将于2021年5月交付

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

声明: 需要在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,
样本数据:

我尝试过的解决方案:

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;