【发布时间】:2017-07-29 18:39:07
【问题描述】:
我正在尝试找到一个可靠的查询,它返回可接受的插入范围的第一个实例。
研究:
- 下面的一些链接解决了类似的问题,但我无法让它们为我工作。
- Find first available date, given a date range in SQL
- Find closest date in SQL Server
- MySQL difference between two rows of a SELECT Statement
- How to find a gap in range in SQL
- 还有更多...
目标查询函数:
- InsertRange(1) = (StartRange(i) - EndRange(i-1)) > 新值
其中 InsertRange(1) 是查询应返回的值。换句话说,这将是满足上述条件的第一个实例。
表结构:
- 主键:StartRange
- StartRange(i-1)
- StartRange(i-1) + EndRange(i-1)
- StartRange(i-1) + EndRange(i-1)
示例数据集
下面是一个示例用户表(3 列),具有设定的范围分布。 StartRanges 总是严格按升序排列,UserID 是任意字符串,只有 StartRange 和 EndRange 的序列重要:
开始范围结束范围用户 ID 312 6896 用户0 7134 16268 用户1 16877 22451 用户2 23137 25142 用户3 25955 28272 用户4 28313 35172 用户5 35593 38007 用户6 38319 38495 用户7 38565 45200 用户8 46136 48007 用户9我当前的查询
我目前正在尝试使用此查询:
SELECT t2.StartRange, t2.EndRange
FROM user AS t1, user AS t2
WHERE (t1.StartRange - t2.StartRange+1) > NewValue
ORDER BY t1.EndRange
LIMIT 1
示例案例
给定表格,如果 NewValue = 800,那么返回的答案应该是 23137。这意味着,第一个可用插槽将在 user3 和 user4 之间(实际插槽大小 = 813):
InsertRange(1) = (StartRange(i) - EndRange(i-1)) > NewValue
InsertRange = (StartRange(6) - EndRange(5)) > NewValue
23137 = 25955 - 25142 > 800
更多评论
- 我上面的查询似乎适用于 StartRange 紧密排列的特殊情况(即 StartRange(i) = StartRange(i-1) + EndRange(i-1) + 1)。这不再适用于不太紧密的 StartRanges 集
【问题讨论】:
-
你期望的结果应该是什么?
标签: mysql