Có một thủ thuật đơn giản để thu gọn các mục nhập liên tiếp vào một nhóm duy nhất. Nếu bạn nhóm theo (row_number - mục nhập), các mục nhập liên tiếp sẽ kết thúc trong cùng một nhóm. Đây là một ví dụ chứng minh ý tôi muốn nói:
Truy vấn :
SELECT phonenum, @curRow := @curRow + 1 AS row_number, phonenum - @curRow
from phonenums p
join (SELECT @curRow := 0) r
Kết quả :
| PHONENUM | ROW_NUMBER | PHONENUM - @CURROW |
-------------------------------------------------
| 27100070000 | 1 | 27100069999 |
| 27100070001 | 2 | 27100069999 |
| 27100070002 | 3 | 27100069999 |
| 27100070003 | 4 | 27100069999 |
| 27100070004 | 5 | 27100069999 |
| 27100070005 | 6 | 27100069999 |
| 27100070008 | 7 | 27100070001 |
| 27100070009 | 8 | 27100070001 |
| 27100070012 | 9 | 27100070003 |
| 27100070015 | 10 | 27100070005 |
| 27100070016 | 11 | 27100070005 |
| 27100070040 | 12 | 27100070028 |
Lưu ý rằng các mục nhập liên tiếp đều có cùng giá trị cho PHONENUM - @CURROW
. Nếu chúng tôi nhóm trên cột đó và chọn giá trị tối thiểu &tối đa của mỗi nhóm, bạn sẽ có bản tóm tắt (với một ngoại lệ:bạn có thể thay thế giá trị END bằng NULL
if START =END nếu đó là một yêu cầu):
Truy vấn :
select min(phonenum), max(phonenum) from
(
SELECT phonenum, @curRow := @curRow + 1 AS row_number
from phonenums p
join (SELECT @curRow := 0) r
) p
group by phonenum - row_number
Kết quả :
| MIN(PHONENUM) | MAX(PHONENUM) |
---------------------------------
| 27100070000 | 27100070005 |
| 27100070008 | 27100070009 |
| 27100070012 | 27100070012 |
| 27100070015 | 27100070016 |
| 27100070040 | 27100070040 |
Bản trình diễn: http://www.sqlfiddle.com/#!2/59b04/5