回答編集履歴

7

推敲

2020/11/17 14:52

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -80,4 +80,8 @@
80
80
 
81
81
 
82
82
 
83
+ 初心者レベルならSQLのみでは解決できません。
84
+
85
+ テーブルを日時順に読み込んで、start、endを作成するような処理になるはずです。
86
+
83
- 初心者にこれを任せるプロジェクトというのは、前途多難ですね。
87
+ 指針もなくこれを丸投げするプロジェクトだったりすると、前途多難ですね。

6

推敲

2020/11/17 14:52

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -80,4 +80,4 @@
80
80
 
81
81
 
82
82
 
83
- 前途多難ですね。
83
+ 初心者にこれを任せるプロジェクトというのは、前途多難ですね。

5

修正

2020/11/17 14:46

投稿

sazi
sazi

スコア25195

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

修正

2020/11/17 11:37

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -14,13 +14,15 @@
14
14
 
15
15
  select *
16
16
 
17
- , lag(machine || error_code, 1, '') over(order by error_date) lag_key
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 || error_code != lag_key then error_date end error_start
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

追記

2020/11/17 11:36

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -69,3 +69,11 @@
69
69
 
70
70
 
71
71
  ぱっと思いついて組み立てただけなので、観点を変えると簡潔な記述があるかもしれません。
72
+
73
+
74
+
75
+ > DB初心者です
76
+
77
+
78
+
79
+ 前途多難ですね。

2

名称を合わせた

2020/11/17 11:28

投稿

sazi
sazi

スコア25195

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 log
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 log left join step4
45
+ from tr_machine_error left join step4
46
46
 
47
- on log.error_date >= step4.error_start
47
+ on tr_machine_error.error_date >= step4.error_start
48
48
 
49
- and (log.error_date < lead_error_start or lead_error_start is null)
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

推敲

2020/11/17 11:22

投稿

sazi
sazi

スコア25195

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