mysql - MySQL - 按最低差异搜索日期范围和分组
问题描述
我需要找到尽可能接近人们正在搜索的所需日期范围的所有对象的一个价格。一个对象在不同的日期范围内可以有多个价格。
价格表
ID | 对象标识 | 价格 | 开始 | 结尾 |
---|---|---|---|---|
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 | 对象标识 | 价格 |
---|---|---|
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-05-01') + DATEDIFF(`end`, '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
推荐阅读
- flask - Flask-WTF 是否支持 reCAPTCHA v3?
- algorithm - 背包问题中的表格与动态规划之间有什么联系?
- c# - 如何从 DropDownList 中查找值
- java - 我的 java 应用程序中的两个类具有相同的限定名称
- linux - 如何调试作为软件中so文件一部分的cpp文件?
- angularjs - 如何在 AngularJS 单元测试中使用 $httpBackend 注入和模拟 $http?
- google-visualization - 图表范围过滤器控件创建的矩形比控件大得多
- javascript - 在加载反应js之前存储JS变量
- google-sheets - 根据不同的范围有条件地格式化范围
- bolt-cms - 在数组字段包含值的地方使用`setcontent`