Има прост трик за свиване на последователни записи в една група. Ако групирате по (номер_ред - запис), записи, които са последователни, ще се окажат в същата група. Ето пример, демонстриращ какво имам предвид:
Запитване :
ИЗБЕРЕТЕ телефонен номер, @curRow :=@curRow + 1 AS номер_ред, телефонен номер - @curRowот телефонни номера pjoin (SELECT @curRow :=0) r
Резултати :
<предварителен код>| 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 |
Забележете как всички последователни записи имат една и съща стойност за PHONENUM - @CURROW
. Ако групираме в тази колона и изберем min &max на всяка група, имате обобщението (с едно изключение:можете да замените стойността END с NULL
ако START =END, ако това е изискване):
Запитване :
изберете min(phonenum), max(phonenum) от( SELECT phonenum, @curRow :=@curRow + 1 AS row_number от телефонни номера p join (SELECT @curRow :=0) r) pgroup by phonenum - row_number
Резултати :
<предварителен код>| MIN(PHONENUM) | MAX(PHONENUM) |--------------------------------| 27100070000 | 27100070005 || 27100070008 | 27100070009 || 27100070012 | 27100070012 || 27100070015 | 27100070016 || 27100070040 | 27100070040 |Демо:http://www.sqlfiddle.com/#!2/59b04/5