teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

修正

2017/03/03 14:17

投稿

yambejp
yambejp

スコア117906

answer CHANGED
@@ -76,14 +76,23 @@
76
76
  (69,'c','2017-03-03 21:49:56','live'),
77
77
  (70,'d','2017-03-03 21:49:58','live');
78
78
  ```
79
+ # 修正
80
+ 前後がいる?
81
+ - viewを用意します
82
+ ```SQL
83
+ create view vw as select id,name,dt,status,(select count(*)+1 from tbl as t2 where t2.name=t1.name and t2.dt<t1.dt) as rank from tbl as t1;
84
+ ```
79
85
 
80
86
  - 遷移抽出
81
- nameごとに遷移があった箇所を抽出
87
+ nameごとに前後いずれかに遷移があったレコードを抽出
82
88
  ```SQL
89
+ select v2.id,v2.rank,v2.name,v2.dt
90
+ ,v1.status as beforestatus
83
- select *
91
+ ,v2.status
92
+ ,v3.status as afterstatus
93
+ from vw as v1
84
- from (select id,name,status,(select count(*)+1 from tbl as t2 where t2.name=t1.name and t2.dt<t1.dt) as rank from tbl as t1) as t3
94
+ inner join vw as v2 on v1.name=v2.name and v1.rank+1=v2.rank
85
- inner join (select id,name,status,(select count(*)+1 from tbl as t5 where t5.name=t4.name and t5.dt<t4.dt) as rank from tbl as t4) as t6
86
- on t3.name=t6.name and t3.rank+1=t6.rank
95
+ inner join vw as v3 on v2.name=v3.name and v2.rank+1=v3.rank
87
- and not(t3.status=t6.status)
96
+ where not(v1.status=v2.status) or not(v2.status=v3.status)
88
-
97
+ order by v2.name,v2.id
89
- ```
98
+ ```