如何解决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-01
和 2021-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
,
这是一个接缝工作的解决方案,但我猜对差异进行连接可能会导致结果模糊。
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 举报,一经查实,本站将立刻删除。