我需要从一组“系列”(仅限数字)中找到连续的数字范围(最小值,最大值)。
我使用 @row_number 编写了一个SQL,但它部分工作。如果行ID(int,primary,auto_increment)不连续,则返回2个结果集而不是一个。
检查this sqlfiddle以查看查询的工作原理。
所以我需要找到一种方法,不使用@row_number或使用它,但条件是将2个结果“绑定”为单个,系列是连续的(即使ID不连续)。< / p>
正确的结果应该是:(见this sqlfiddle)
MIN MAX PRODUCT_ID
220 230 20
1106 1108 18
1110 1110 18
1112 1120 18
响应时间也很重要。
由于
答案 0 :(得分:1)
我认为你是在追求这样的事情......
SELECT a.product_id
, a.series start
, MIN(c.series) end
FROM card a
LEFT
JOIN card b
ON b.product_id = a.product_id
AND b.series = a.series - 1
LEFT
JOIN card c
ON c.product_id = a.product_id
AND c.series >= a.series
LEFT
JOIN card d
ON d.product_id = a.product_id
AND d.series = c.series + 1
WHERE b.series IS NULL
AND c.series IS NOT NULL
AND d.series IS NULL
GROUP
BY a.product_id
, a.series;
http://sqlfiddle.com/#!2/32dc8/4
如果性能仍然存在问题,那么我们可以再看看@variables
的解决方案