2018.12.06 Thursday
Firebirdの分析関数の衝撃(7) 「3人なんですけど座れますか?」(行の折り返しを考慮しない)
本エントリはFirebird Advent Calendar 2018 の六日目です。今年も参加者募集!
Firebirdの分析関数の衝撃(7) 「3人なんですけど座れますか?」(行の折り返しを考慮しない)
1. 「3人なんですけど座れますか?」その1:行の折り返しを考慮しない
まずミックさんの『SQLで数列を扱う』で提示されているSQL「人数分の空席を探す その1:行の折り返しを考慮しない」では、バインド変数(プレースホルダ) :head_cntが利用されています。Firebirdでも2.1以降でユーザコンテキスト変数があるので、それを使えばエミュレートできますが、ここは素直に即値の3を使います。(3以外の値を汎用的に利用したい場合はユーザコンテキスト変数を使ってください)
SELECT S1.seat AS start_seat, '〜' , S2.seat AS end_seat
FROM Seats S1, Seats S2
WHERE S2.seat = S1.seat + (3 -1) --始点と終点を決める
AND NOT EXISTS
(SELECT *
FROM Seats S3
WHERE S3.seat BETWEEN S1.seat AND S2.seat
AND S3.status <> '空' );
次に言及だけされている「PostgreSQL8.4では文法エラー」のものは動きません。
これは先に説明したフレーム句が未サポートのためです。
テーブルとデータはダウンロードできる形式のものは使えないし、FirebirdではCREATE TABLE ... AS SELECT....
が使えないので、普通に作成します。
create table Seats(seat int,status char(2));
insert into Seats values(1,'占');
insert into Seats values(2,'占');
insert into Seats values(3,'空');
insert into Seats values(4,'空');
insert into Seats values(5,'空');
insert into Seats values(6,'占');
insert into Seats values(7,'空');
insert into Seats values(8,'空');
insert into Seats values(9,'空');
insert into Seats values(10,'空');
insert into Seats values(11,'空');
insert into Seats values(12,'占');
insert into Seats values(13,'占');
insert into Seats values(14,'空');
insert into Seats values(15,'空');
これで確認すると、掲載されているWindow関数版、非Window関数版のクエリとも
PostgreSQL 8.4レベルのものは全部実行できます。結果はこんな感じです。
SEATSTART SEATEND
============ ============
3 5
7 9
8 10
9 11
Firebirdの分析関数の衝撃(7) 「3人なんですけど座れますか?」(行の折り返しを考慮しない)
1. 「3人なんですけど座れますか?」その1:行の折り返しを考慮しない
まずミックさんの『SQLで数列を扱う』で提示されているSQL「人数分の空席を探す その1:行の折り返しを考慮しない」では、バインド変数(プレースホルダ) :head_cntが利用されています。Firebirdでも2.1以降でユーザコンテキスト変数があるので、それを使えばエミュレートできますが、ここは素直に即値の3を使います。(3以外の値を汎用的に利用したい場合はユーザコンテキスト変数を使ってください)
SELECT S1.seat AS start_seat, '〜' , S2.seat AS end_seat
FROM Seats S1, Seats S2
WHERE S2.seat = S1.seat + (3 -1) --始点と終点を決める
AND NOT EXISTS
(SELECT *
FROM Seats S3
WHERE S3.seat BETWEEN S1.seat AND S2.seat
AND S3.status <> '空' );
次に言及だけされている「PostgreSQL8.4では文法エラー」のものは動きません。
これは先に説明したフレーム句が未サポートのためです。
テーブルとデータはダウンロードできる形式のものは使えないし、FirebirdではCREATE TABLE ... AS SELECT....
が使えないので、普通に作成します。
create table Seats(seat int,status char(2));
insert into Seats values(1,'占');
insert into Seats values(2,'占');
insert into Seats values(3,'空');
insert into Seats values(4,'空');
insert into Seats values(5,'空');
insert into Seats values(6,'占');
insert into Seats values(7,'空');
insert into Seats values(8,'空');
insert into Seats values(9,'空');
insert into Seats values(10,'空');
insert into Seats values(11,'空');
insert into Seats values(12,'占');
insert into Seats values(13,'占');
insert into Seats values(14,'空');
insert into Seats values(15,'空');
これで確認すると、掲載されているWindow関数版、非Window関数版のクエリとも
PostgreSQL 8.4レベルのものは全部実行できます。結果はこんな感じです。
SEATSTART SEATEND
============ ============
3 5
7 9
8 10
9 11
JUGEMテーマ:コンピュータ