数値のリストを含む SQLite テーブルがあります。次のようになります。
1
2
3
8
9
11
12
13
14
15
18
19
これらを連続した ID を持つブロックに変換する必要があります。例えば、
1-3
8-9
11-15
18-19
これはSQLだけを使用して可能ですか、それともループして以前と現在を比較する必要がありますか...
一時テーブルを使用して解決策を見つけました。
まず、開始エンドポイントとエンドポイントを特定する必要があります。
http://sqlfiddle.com/#!5/fdc26/13
SELECT
a.x AS ax,
CASE WHEN p.x IS NULL THEN 1
WHEN n.x IS NULL THEN 2
ELSE 0
END AS begin_or_end
FROM num AS a
LEFT JOIN num AS n ON a.x + 1 = n.x /* n: next */
LEFT JOIN num AS p ON a.x - 1 = p.x /* p: prev */
WHERE p.x IS NULL
OR n.x IS NULL
ORDER BY a.x ASC;
または、これを2つのクエリに分割することもできます。
SELECT a.x AS begin_point
FROM num AS a
LEFT JOIN num AS p ON a.x - 1 = p.x /* p: prev */
WHERE p.x IS NULL
ORDER BY a.x ASC;
SELECT a.x AS end_point
FROM num AS a
LEFT JOIN num AS n ON a.x + 1 = n.x /* n: next */
WHERE n.x IS NULL
ORDER BY a.x ASC;
私の例で呼ばれる一時テーブルを作成するための最初のオプションを選択しましたlohi
。すべてのテーブルに自動があるという事実を使用しますrowid
(詳細については、 http: //www.sqlite.org/lang_createtable.html/ROWIDsとINTEGERPRIMARYKEYを参照してください) 。
最後のクエリ:
http://sqlfiddle.com/#!5/21770/1
SELECT lo.ax, hi.ax
FROM lohi AS lo
INNER JOIN lohi AS hi ON lo.rowid+1 = hi.rowid
WHERE lo.rowid % 2;