質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

797閲覧

【SQL】カウンターの値がリセットされた直前の値を取得

HRNK

総合スコア2

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2023/06/20 13:47

実現したいこと

SQL Server 2019にて記録している生産カウンタのテーブルがある。リセット前の値とその時の日時を全て取得するSQLを考えたい。

前提

・テーブル名は「ProdCounter」
・フィールドは「TimeStamp (Date Time))」と「Counter (Integer)」
・24時間、365日、毎分「TimeStamp」と「Counter」の値を記録する。
・シフト勤務の入れ替え時にカウンタはリセットされる。一日につき2-3回。
・記録間隔は1分なので、リセット後の次のCounterの記録は「ゼロ」とは限らない。
・リセット直前のTimeStampとCounterの値を全て取得したい。

例)
TimeStamp Counter
2023/06/19 14:50 164
2023/06/19 14:49 136
2023/06/19 14:48 87
2023/06/19 14:47 37
2023/06/19 14:46 15458
2023/06/19 14:45 12033
2023/06/19 14:44 10111
2023/06/19 14:43 8210
2023/06/19 14:42 5232
2023/06/19 14:41 3589
2023/06/19 14:40 1258
2023/06/19 14:39 200
2023/06/19 14:38 25
2023/06/19 14:37 9
2023/06/19 14:36 14958
2023/06/19 14:35 11056
2023/06/19 14:34 9325
2023/06/19 14:33 6899
2023/06/19 14:32 4568
2023/06/19 14:31 2298
2023/06/19 14:30 875
2023/06/19 14:29 268
2023/06/19 14:28 61
2023/06/19 14:27 14553
2023/06/19 14:26 14553

希望結果)
TimeStamp Counter
2023/06/19 14:46 15458
2023/06/19 14:36 14958
2023/06/19 14:27 14553

発生している問題・エラーメッセージ

MAX(Counter)などを使ってみましたが、うまくできませんでした。

該当のソースコード

試したこと

VBAで実現できましたが、10,000レコードくらいになるとかなり処理時間がかかるので、SQLでできないかと思った次第です。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

SQL Server 2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2023/06/20 17:48

そのVBAのコードを質問に追記された方が、質問内容が明確になってが良いかと思います。
HRNK

2023/06/20 23:00

sazi様、コメントありがとうございました。色々バタバタしていて、勘違いの補足を書き込んでおりました。VBAで実現できたのは、エクセルのシートで必要なデータを絞り込んで、SQLサーバからそのデータをシートに取り込むスクリプトでした。リセット前の値を取得するものではありません。このスクリプトが結構遅かったので、SQL側で処理できないかと相談差し上げております。混乱を招き申し訳ありません。
guest

回答3

0

TimeStamp が必ず連続しているのであればずらして自己結合すればよいだけでは?
(以下MySQLのサンプル)

SQL

1select * from ProdCounter as t1 2inner join ProdCounter as t2 on 3t1.TimeStamp =t2.TimeStamp -interval 1 minute 4and t1.Counter >t2.Counter

※連続性のあるデータなら時間で差分を取るよりも、auto_incrementでカウントアップしていき
その差でやる方が楽かもしれません

投稿2023/06/21 01:21

編集2023/06/21 02:16
yambejp

総合スコア117674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HRNK

2023/06/21 16:32

yambejp様、なるほどです。考え方はわかりましたが、何故か「-interval 1 minute」がSyntaxエラーになりました。
guest

0

ベストアンサー

1分後のCounterよりも値が大きい行を取得したいという認識で正しいですか? であれば、この要件をそのままSQLに変換することができます。

SQL

1SELECT * 2FROM ProdCounter AS P1 3WHERE Counter > ( 4 SELECT Counter 5 FROM ProdCounter AS P2 6 WHERE DATEADD(minute, 1, P1.TimeStamp) = P2.Timestamp 7);

個人的にはWindow関数を利用する方法が好みです。

SQL

1SELECT TimeStamp, Counter 2FROM ( 3 SELECT *, LEAD(Counter) OVER (ORDER BY TimeStamp) AS NextCounter 4 FROM ProdCounter 5) AS X 6WHERE Counter > NextCounter

投稿2023/06/21 00:33

neko_the_shadow

総合スコア2374

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HRNK

2023/06/21 16:35

neko_the_shadow様、ありがとうございました。どちらも問題ありませんでしたが、TimeStampの間隔がが1分以上あるところがあり、NextCounterのほうが本件に向いているようです。
guest

0

手元にSQLServerがないので、PostgreSQLでの結果です。同じようなことはできる、のではないかと。

  1. 時刻順に並べる
  2. ひとつ次のcounterを連結する
  3. 現在のcounterと次のcounterを比較して...

sql

1with 2aa as ( 3 select * from test order by time 4), 5bb as ( 6 select 7 *, 8 lead(counter) over (order by time) as nextCounter 9 from aa 10) 11select * from bb 12 where 13 counter > nextCounter 14 or 15 nextCounter is null 16 ;
timecounternextcounter
2023-06-19 14:27:00.0001455361
2023-06-19 14:36:00.000149589
2023-06-19 14:46:00.0001545837
2023-06-19 14:50:00.000164null

sql

1create table test(time timestamp, counter int); 2insert into test 3 values 4 ('2023/06/19 14:50', 164), 5 ('2023/06/19 14:49', 136), 6 ('2023/06/19 14:48', 87), 7 ('2023/06/19 14:47', 37), 8 ('2023/06/19 14:46', 15458), 9 ('2023/06/19 14:45', 12033), 10 ('2023/06/19 14:44', 10111), 11 ('2023/06/19 14:43', 8210), 12 ('2023/06/19 14:42', 5232), 13 ('2023/06/19 14:41', 3589), 14 ('2023/06/19 14:40', 1258), 15 ('2023/06/19 14:39', 200), 16 ('2023/06/19 14:38', 25), 17 ('2023/06/19 14:37', 9), 18 ('2023/06/19 14:36', 14958), 19 ('2023/06/19 14:35', 11056), 20 ('2023/06/19 14:34', 9325), 21 ('2023/06/19 14:33', 6899), 22 ('2023/06/19 14:32', 4568), 23 ('2023/06/19 14:31', 2298), 24 ('2023/06/19 14:30', 875), 25 ('2023/06/19 14:29', 268), 26 ('2023/06/19 14:28', 61), 27 ('2023/06/19 14:27', 14553), 28 ('2023/06/19 14:26', 14553) 29 ;

投稿2023/06/21 00:11

編集2023/06/21 00:30
shiketa

総合スコア4114

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HRNK

2023/06/21 16:29

shiketa様、参考になります。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問