7

MySql5に電話番号のテーブルがあります。シンプルな構造は

Accounts
id varchar(32) NOT NULL

記録は以下の通りです

27100070000
27100070001
27100070002
27100070003
27100070004
27100070005
27100070008
27100070009
27100070012
27100070015
27100070016
27100070043

このデータを並べ替えて、連続する数値のブロックを数値範囲にグループ化する必要があります。私はC#LINQでソリューションを実装することにオープンですが、サーバー側のMySqlが最優秀賞です。MySqlに、出力が次のようになるようにこのデータを要約する方法はありますか?

Start       | End
-------------------------
27100070000 | 27100070005
27100070008 | 27100070009
27100070012 | 27100070015
27100070016 | NULL
27100070043 | NULL
4

1 に答える 1

15

連続するエントリを1つのグループにまとめる簡単なトリックがあります。(row_number-entry)でグループ化すると、連続するエントリは同じグループになります。これが私が何を意味するかを示す例です:

クエリ

SELECT phonenum, @curRow := @curRow + 1 AS row_number, phonenum - @curRow
from phonenums p
join (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。その列でグループ化し、各グループの最小値と最大値を選択すると、要約が得られます(ただし、1つの例外があります。必要にNULL応じて、END値をSTART = ENDに置き換えることができます)。

クエリ

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

結果

| MIN(PHONENUM) | MAX(PHONENUM) |
---------------------------------
|   27100070000 |   27100070005 |
|   27100070008 |   27100070009 |
|   27100070012 |   27100070012 |
|   27100070015 |   27100070016 |
|   27100070040 |   27100070040 |

デモ:http ://www.sqlfiddle.com/#!2 / 59b04 / 5

于 2012-11-19T15:45:07.303 に答える