前提・実現したいこと
MS SQL Serverのテーブルに以下のとおり
時系列で回転数の変化を計測した情報を保存しています。
[Time] | [rpm]
2013-04-16 11:11:00.0000000| 100
2013-04-16 11:11:10.0000000| 250
2013-04-16 11:11:20.0000000| 400
2013-04-16 11:11:30.0000000| 600
:
2013-04-16 11:15:30.0000000| 2800
2013-04-16 11:15:40.0000000| 3000
2013-04-16 11:15:50.0000000| 3010
2013-04-16 11:16:00.0000000| 3005
:
2013-04-16 11:20:00.0000000| 800
2013-04-16 11:20:10.0000000| 620
2013-04-16 11:20:20.0000000| 320
2013-04-16 11:20:30.0000000| 100
このテーブルから指定の回転数毎に間引いたレコードのみ返すクエリーを書きたいと思います。
例えば間引き回転数を400ピッチに指定すると、[100,400・・2800・・800,620,100]のレコードが返るようなクエリです。
時刻で間引くのであれば、時分秒を丸めるような方法がこちらにも掲載されていましたが、
繰り返し登場するようなデータなので、1レコードずつ読み込んで処理する以外方法はないのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
間引く条件が rpm が特定の数値の倍数の周辺である、ならば、
SQL
1select * from table where ABS((rpm % 400)-200) >= (200-5);
で行けそうな気もしますが、ことはそう単純ではないのですかね。
上の例は 400±5 の範囲で引っかかります。
例えば rpm = 396 のレコードがあった場合、rpm % 400 -200 = 196 ですから、195 より大きいので成立。
同様に rpm = 403 のレコードの場合、rpm % 400 - 200 = -197 で、絶対値が 197 になり成立。
投稿2018/11/07 02:10
総合スコア13703
0
ベストアンサー
1レコードずつ読み込んで処理する以外方法はないのでしょうか。
特定のピッチ間隔のデータがあればそれと結合する事で目的は果たせます。
この元になるデータを返却してくれる関数が他のDBMSには存在するのですが、残念ながらT-SQLには存在しません。
これを自作されている方もおられます。
SQL Server TVF(テーブル値) - 関連生成関数 -
こういった関数を使用せず、それでも一括で行うなら、テンポラリーテーブルを特定のピッチ刻みで作成する事になるかと思います。
※ユニオンクエリーを行数分動的に作成するという、スマートではない方法も考えられますが。
追記
rpmの最大をピークとして、ピークまでとピーク以降に分割、rpmはピッチ毎に分割し、
そのデータ内の最大のrpmのデータに間引く。(※前提として連続して同じrpmは無し)
試してはいませんが、上記仕様で組み立てたSQLです。
SQL
1with base as ( 2 select *, (select max(time) from tbl where rpm =(select max(rpm) from tbl)) as peak_time 3 from tbl 4) 5, blocking as ( 6 select *, case when time<=peak_time then 0 else 1 end as peak_block, FLOOR(rpm / 400) as rpm_block 7 from base 8) 9select * 10from blocking src 11where time = ( 12 select max(time) from tbl 13 where rpm=(select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block) 14 )
追記2
lagを使用した別パターン
SQL
1with blocking as ( 2 select * 3 , case when rpm - lag(rpm, 1, 0) over(order by time) >= 0 then 0 else 1 end as peak_block 4 , FLOOR(rpm / 400) as rpm_block 5 from tbl 6) 7select * 8from blocking src 9where time = ( 10 select max(time) from tbl 11 where rpm=(select max(rpm) from blocking where peak_block=src.peak_block and rpm_block=src.rpm_block) 12 )
投稿2018/11/06 15:17
編集2018/11/07 12:09総合スコア25138
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/07 00:38
2018/11/07 02:16 編集
2018/11/07 06:10
2018/11/07 06:38 編集
2018/11/07 07:33 編集
2018/11/07 07:48 編集
2018/11/07 07:47
2018/11/07 07:50
2018/11/07 08:34
2018/11/07 12:10
2018/11/07 14:01 編集
2018/11/07 14:12
2018/11/07 14:35
2018/11/08 00:27
2018/11/08 00:54 編集
2018/11/08 08:27
2018/11/08 10:36
2018/11/08 10:47
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/07 05:14
2018/11/07 06:02