- 2006-03-21
- pgsql
札幌の地下鉄東西線新札幌方面からさっぽろ駅又は南北線麻生方面へ 通勤している人は共感してくれるのではないかというネタ。
ちょっと遅い時間帯に帰宅時するとき非常に腹が立つのは、 大通り駅での乗り継ぎのタイミングが、 どの列車のやたらとシビアなのだ。 なので、南北線真駒内方面から東西線新札幌方面へ 乗り継ぐ人時に大通り駅の中を走っている人をよく見かける。 (また走ると大抵間に合ってしまうところが腹立たしい)。
で、実際どの程度シビアなのかを調べてみた。 まあ SQL なんか使わなくてもいいんだけどネタとして。
札幌市営地下鉄のサイトから 時刻表をとってくる。PDF なんだけどこれから大通り駅の 時刻表をコピペしてテキストにする。 平日と休日の時刻表が左右に並んじゃってるけど、 休日分は手で削除してこんなデータができる。
6 10 20 30 41 51 58 7 5 12 20 27 34 41 45 49 53 56 ...
で、時刻っぽくするために perl で処理。
$ perl -ane '$h = shift @F; print "$h:$_\n" foreach (@F)' sn_s.txt > sn_s.data $ cat sn_s.data 6:10 6:20 6:30 6:41
ちなみに sn_s は南北線の南方面行き。あとはこれを PostgreSQL にいれる。
ishida=# create table sn_s (t time primary key);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "sn_s_pkey" for t
able "sn_s"
CREATE TABLE
ishida=# \copy sn_s from 'sn_s.data'
\.
ishida=# SELECT * from sn_s;
t
----------
06:10:00
06:20:00
...
ew_e (東西線東方面) も同様に処理して、 さて、求めるべきは、「南北線南方面行きの各時刻に対して、 それより大きい東西線東方面行きの時刻の中で最小のものとその差」だ。 例を 2 つ挙げておこう。大抵の人は前者の方が好きなんじゃないかな。
例1)
SELECT sn_s.t
, (SELECT min(t) - sn_s.t
FROM ew_e WHERE t > sn_s.t)
FROM sn_s;
例2)
SELECT sn_s.t
, min(ew_e.t) - sn_s.t
FROM sn_s
JOIN ew_e ON (sn_s.t < ew_e.t)
GROUP BY 1;
結果、 やはり 20 時以降はやたらと 1 分乗り継ぎが多い。 調子にのって平均値を出してみる。
例1)
SELECT date_part('hour', t)
, avg(t_diff)
FROM (SELECT sn_s.t
, (SELECT min(t) - sn_s.t
FROM ew_e WHERE t > sn_s.t) AS t_diff
FROM sn_s) AS t_sub
GROUP BY 1
ORDER BY 1;
例2)
SELECT date_part('hour', t)
, avg(t_diff)
FROM (SELECT sn_s.t
, min(ew_e.t) - sn_s.t AS t_diff
FROM sn_s
JOIN ew_e ON (sn_s.t < ew_e.t)
GROUP BY 1) AS t_sub
GROUP BY 1
ORDER BY 1;
結果
date_part | avg
-----------+-----------------
0 | 00:05:30
6 | 00:04:40
7 | 00:03:48
8 | 00:02:07.058824
9 | 00:03:15
10 | 00:04:06
11 | 00:03:40
12 | 00:05:36
13 | 00:01:46.666667
14 | 00:03:46.666667
15 | 00:06:00
16 | 00:02:26.666667
17 | 00:02:32.727273
18 | 00:02:16.363636
19 | 00:02:45
20 | 00:02:00
21 | 00:02:45
22 | 00:02:45
23 | 00:03:30
(19 rows)
13 時が一番シビアだということが判明。 でも 20 時以降は 8 分 とか 9 分とかあるにもかかわらず この平均値だもんなぁ。 同じことを東西線宮の沢方面(西方面)についてやってみる。
date_part | avg
-----------+-----------------
0 | 00:08:30
6 | 00:05:50
7 | 00:02:12
8 | 00:02:00
9 | 00:03:30
10 | 00:03:00
11 | 00:04:20
12 | 00:02:24
13 | 00:04:26.666667
14 | 00:05:13.333333
15 | 00:02:36
16 | 00:04:13.333333
17 | 00:02:54.545455
18 | 00:03:54.545455
19 | 00:04:50
20 | 00:04:34.285714
21 | 00:04:30
22 | 00:04:30
23 | 00:05:20
(19 rows)
やっぱ反対方向の方が余裕あるような気がする。