回答編集履歴

7

同じrpmに対応するよう変更

2018/11/07 12:09

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  rpmの最大をピークとして、ピークまでとピーク以降に分割、rpmはピッチ毎に分割し、
28
28
 
29
- そのデータ内の最大のrpmのデータに間引く。(※前提として連続して同じrpmは無し)
29
+ そのデータ内の最大のrpmのデータに間引く。(~~※前提として連続して同じrpmは無し~~
30
30
 
31
31
  試してはいませんが、上記仕様で組み立てたSQLです。
32
32
 
@@ -34,7 +34,7 @@
34
34
 
35
35
  with base as (
36
36
 
37
- select *, (select time from tbl where rpm =(select max(rpm) from tbl)) as peak_time
37
+ select *, (select max(time) from tbl where rpm =(select max(rpm) from tbl)) as peak_time
38
38
 
39
39
  from tbl
40
40
 
@@ -42,7 +42,7 @@
42
42
 
43
43
  , blocking as (
44
44
 
45
- select *, case when time<=peak_time then 0 else 1 end as peak_block, (rpm / 400) as rpm_block
45
+ select *, case when time<=peak_time then 0 else 1 end as peak_block, FLOOR(rpm / 400) as rpm_block
46
46
 
47
47
  from base
48
48
 
@@ -52,9 +52,11 @@
52
52
 
53
53
  from blocking src
54
54
 
55
- where rpm = (
55
+ where time = (
56
56
 
57
+ select max(time) from tbl
58
+
57
- select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block
59
+ where rpm=(select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block)
58
60
 
59
61
  )
60
62
 
@@ -72,9 +74,9 @@
72
74
 
73
75
  select *
74
76
 
75
- , case when rpm - lag(rpm, 1, 0) over(order by time) > 0 then 0 else 1 end as peak_block
77
+ , case when rpm - lag(rpm, 1, 0) over(order by time) >= 0 then 0 else 1 end as peak_block
76
78
 
77
- , (rpm / 400) as rpm_block
79
+ , FLOOR(rpm / 400) as rpm_block
78
80
 
79
81
  from tbl
80
82
 
@@ -84,9 +86,11 @@
84
86
 
85
87
  from blocking src
86
88
 
87
- where rpm = (
89
+ where time = (
88
90
 
91
+ select max(time) from tbl
92
+
89
- select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block
93
+ where rpm=(select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block)
90
94
 
91
95
  )
92
96
 

6

修正

2018/11/07 12:08

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  select *
74
74
 
75
- , case when rpm - lag(rpm) over(order by time) > 0 then 0 else 1 end as peak_block
75
+ , case when rpm - lag(rpm, 1, 0) over(order by time) > 0 then 0 else 1 end as peak_block
76
76
 
77
77
  , (rpm / 400) as rpm_block
78
78
 

5

追記

2018/11/07 07:07

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -59,3 +59,35 @@
59
59
  )
60
60
 
61
61
  ```
62
+
63
+ 追記2
64
+
65
+ --
66
+
67
+ [lag](https://docs.microsoft.com/ja-jp/sql/t-sql/functions/lag-transact-sql?view=sql-server-2017)を使用した別パターン
68
+
69
+ ```SQL
70
+
71
+ with blocking as (
72
+
73
+ select *
74
+
75
+ , case when rpm - lag(rpm) over(order by time) > 0 then 0 else 1 end as peak_block
76
+
77
+ , (rpm / 400) as rpm_block
78
+
79
+ from tbl
80
+
81
+ )
82
+
83
+ select *
84
+
85
+ from blocking src
86
+
87
+ where rpm = (
88
+
89
+ select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block
90
+
91
+ )
92
+
93
+ ```

4

追記

2018/11/07 06:58

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  rpmの最大をピークとして、ピークまでとピーク以降に分割、rpmはピッチ毎に分割し、
28
28
 
29
- そのデータ内の最大のrpmのデータに間引く。
29
+ そのデータ内の最大のrpmのデータに間引く。(※前提として連続して同じrpmは無し)
30
30
 
31
31
  試してはいませんが、上記仕様で組み立てたSQLです。
32
32
 

3

修正

2018/11/07 06:42

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  where rpm = (
56
56
 
57
- select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block
57
+ select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block
58
58
 
59
59
  )
60
60
 

2

SQL修正

2018/11/07 06:37

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  , blocking as (
44
44
 
45
- select *, (time<=peak_time) as peak_block, (rpm / 400) as rpm_block
45
+ select *, case when time<=peak_time then 0 else 1 end as peak_block, (rpm / 400) as rpm_block
46
46
 
47
47
  from base
48
48
 
@@ -54,7 +54,7 @@
54
54
 
55
55
  where rpm = (
56
56
 
57
- select max(rpm) from blocking where peak_block=src.peak_block, rpm_block=src.rpm_block
57
+ select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block
58
58
 
59
59
  )
60
60
 

1

追記

2018/11/07 06:36

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -17,3 +17,45 @@
17
17
  こういった関数を使用せず、それでも一括で行うなら、テンポラリーテーブルを特定のピッチ刻みで作成する事になるかと思います。
18
18
 
19
19
  ※ユニオンクエリーを行数分動的に作成するという、スマートではない方法も考えられますが。
20
+
21
+
22
+
23
+ 追記
24
+
25
+ --
26
+
27
+ rpmの最大をピークとして、ピークまでとピーク以降に分割、rpmはピッチ毎に分割し、
28
+
29
+ そのデータ内の最大のrpmのデータに間引く。
30
+
31
+ 試してはいませんが、上記仕様で組み立てたSQLです。
32
+
33
+ ```SQL
34
+
35
+ with base as (
36
+
37
+ select *, (select time from tbl where rpm =(select max(rpm) from tbl)) as peak_time
38
+
39
+ from tbl
40
+
41
+ )
42
+
43
+ , blocking as (
44
+
45
+ select *, (time<=peak_time) as peak_block, (rpm / 400) as rpm_block
46
+
47
+ from base
48
+
49
+ )
50
+
51
+ select *
52
+
53
+ from blocking src
54
+
55
+ where rpm = (
56
+
57
+ select max(rpm) from blocking where peak_block=src.peak_block, rpm_block=src.rpm_block
58
+
59
+ )
60
+
61
+ ```