微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL - 按最小差异搜索日期范围和分组

如何解决MySQL - 按最小差异搜索日期范围和分组

我需要找到尽可能接近人们搜索的所需日期范围的所有物品的一个价格。一个对象可以有不同日期范围的多个价格。

价格表

id objectid 价格 开始 结束
1 21 50 2021-01-01 2021-04-01
2 21 60 2021-04-02 2021-08-01
3 22 30 2021-01-01 2021-04-01
4 23 150 2021-01-01 2021-04-01
5 21 20 2021-08-02 2021-09-01
6 23 120 2021-07-01 2021-08-01

假设人们在 2021-05-012021-06-01 之间搜索,结果应该是:

id objectid 价格
2 21 60
3 22 30
6 23 120

我正在处理这个查询,但在某处我失去了注意力。

SELECT p.objectid,p.id
    p.start,p.end,p.price,ABS(DATEDIFF(p.start,'2021-05-01') + DATEDIFF(p.end,'2021-06-01')) diff
FROM
    prices AS p1
INNER JOIN(
    SELECT
        p.objectid,MIN(
            ABS(
                DATEDIFF(start,'2021-05-01') + DATEDIFF(end,'2021-06-01')
            )
        ) AS diff
    FROM
        prices p
    GROUP BY
        p.objectid
) p2
ON
    p1.objectid = p2.objectid AND diff = p2.diff

解决方法

您可以通过自加入来实现这一点。
试试这个下面的查询

SELECT
    Y.id,Y.objectid,Y.price
FROM
    (
    SELECT
        *,ABS(
            DATEDIFF(`start`,'2021-05-01') + DATEDIFF(`end`,'2021-06-01')
        ) AS `diff`
    FROM
        price
) AS Y
INNER JOIN(
    SELECT
        *,MIN(
            ABS(
                DATEDIFF(`start`,'2021-06-01')
            )
        ) AS diff
    FROM
        price
    GROUP BY
        objectid
) AS X
ON
    X.objectid = Y.objectid AND X.diff = Y.diff
ORDER BY
    Y.id

o/p 是这个 enter image description here

,

这是一个接缝工作的解决方案,但我猜对差异进行连接可能会导致结果模糊。

SELECT p.objectid,p.id
    p.start,p.end,p.price
FROM
    prices AS p1
INNER JOIN(
    SELECT
        p.objectid,MIN(
            ABS(
                DATEDIFF(start,'2021-05-01') + DATEDIFF(end,'2021-06-01')
            )
        ) AS diff
    FROM
        prices p
    GROUP BY
        p.objectid
) p2
ON
    p1.objectid = p2.objectid AND (ABS(DATEDIFF(p.start,'2021-05-01') + DATEDIFF(p.end,'2021-06-01'))) = p2.diff

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。