回答編集履歴
7
推敲
test
CHANGED
@@ -80,4 +80,8 @@
|
|
80
80
|
|
81
81
|
|
82
82
|
|
83
|
+
初心者レベルならSQLのみでは解決できません。
|
84
|
+
|
85
|
+
テーブルを日時順に読み込んで、start、endを作成するような処理になるはずです。
|
86
|
+
|
83
|
-
|
87
|
+
指針もなくこれを丸投げするプロジェクトだったりすると、前途多難ですね。
|
6
推敲
test
CHANGED
@@ -80,4 +80,4 @@
|
|
80
80
|
|
81
81
|
|
82
82
|
|
83
|
-
前途多難ですね。
|
83
|
+
初心者にこれを任せるプロジェクトというのは、前途多難ですね。
|
5
修正
test
CHANGED
@@ -7,6 +7,8 @@
|
|
7
7
|
そのブレークポイントを個々のデータにグループの情報として割り当て、全体を集計します。
|
8
8
|
|
9
9
|
区切りの情報を生成するには[lag()やlead()のwindow関数](https://lets.postgresql.jp/documents/technical/window_functions/1)を用います。
|
10
|
+
|
11
|
+
※文字列の結合だと組合せで同じになるかもしれないのでarray[]に変更
|
10
12
|
|
11
13
|
```SQL
|
12
14
|
|
4
修正
test
CHANGED
@@ -14,13 +14,15 @@
|
|
14
14
|
|
15
15
|
select *
|
16
16
|
|
17
|
-
, lag(machine
|
17
|
+
, lag(array[machine, error_code] ::text[], 1, array['',''])
|
18
|
+
|
19
|
+
over(order by error_date) lag_key
|
18
20
|
|
19
21
|
from tr_machine_error
|
20
22
|
|
21
23
|
), step2 as (
|
22
24
|
|
23
|
-
select case when machine
|
25
|
+
select case when array[machine, error_code] ::text[] != lag_key then error_date end error_start
|
24
26
|
|
25
27
|
from step1
|
26
28
|
|
3
追記
test
CHANGED
@@ -69,3 +69,11 @@
|
|
69
69
|
|
70
70
|
|
71
71
|
ぱっと思いついて組み立てただけなので、観点を変えると簡潔な記述があるかもしれません。
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
> DB初心者です
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
前途多難ですね。
|
2
名称を合わせた
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
, lag(machine || error_code, 1, '') over(order by error_date) lag_key
|
18
18
|
|
19
|
-
from
|
19
|
+
from tr_machine_error
|
20
20
|
|
21
21
|
), step2 as (
|
22
22
|
|
@@ -42,11 +42,11 @@
|
|
42
42
|
|
43
43
|
select machine, error_code, error_start, max(error_date) as error_end
|
44
44
|
|
45
|
-
from
|
45
|
+
from tr_machine_error left join step4
|
46
46
|
|
47
|
-
on
|
47
|
+
on tr_machine_error.error_date >= step4.error_start
|
48
48
|
|
49
|
-
and (
|
49
|
+
and (tr_machine_error.error_date < lead_error_start or lead_error_start is null)
|
50
50
|
|
51
51
|
group by machine, error_code, error_start
|
52
52
|
|
1
推敲
test
CHANGED
@@ -62,7 +62,7 @@
|
|
62
62
|
|
63
63
|
**step3:**step4で使用するlead()用にerror_startが設定されている情報のみにします。
|
64
64
|
|
65
|
-
**step4:**error_startでグルーピングする範囲を作成します。
|
65
|
+
**step4:**lead()を用いて、error_startでグルーピングする範囲を作成します。
|
66
66
|
|
67
67
|
**最終:**step4の情報と結合し、集計によってerror_endを求めます。
|
68
68
|
|