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

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

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

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

SQL

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

Q&A

解決済

3回答

1565閲覧

SQL Serverでひと塊のデータの最後だけを並べたい

sollalice

総合スコア35

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2018/01/05 07:53

お世話になります。
SQLのレコードで

Date(年月日時分秒) Code
2018/01/01 00:00:00 0
2018/01/01 00:00:10 A
2018/01/01 00:00:20 0
2018/01/01 00:00:40 0
2018/01/01 00:00:50 A
2018/01/01 00:01:00 3
2018/01/01 00:01:10 4
2018/01/01 00:01:20 5
2018/01/01 00:01:30 6
2018/01/01 00:01:40 7
2018/01/01 00:01:50 8
2018/01/01 00:02:00 9
2018/01/01 00:02:10 1
2018/01/01 00:02:20 2
~~~~~~~~~~~~
2018/01/02 05:05:00 0
2018/01/02 05:05:30 A
2018/01/02 05:05:55 0
2018/01/02 05:06:00 1

というようなデータで、ひと塊になったCode 0の最後のレコード(この場合2018/01/01 00:00:40 0と2018/01/02 05:05:55 0の2件)を抽出したいと思っています。
ルールとして、Code 0が出てくるタイミングは不明、ただし初めのCode 0が出て来た時刻のから次の00秒までに最後のCode 0が登場するがCode 0が連続するとは限らない、Dateの開始と終了のみを指定して上記レコードを取得するというものです。
無能非才な自分にはどう頭を捻ってもSQLが出てきません。そもそもSQLでそのような記述ができるものかも分かりません。
その際のクエリ、そもそもそのような記述ができるものなのか、御教示ください。
よろしく御願いします。

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

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

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

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

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

sousuke

2018/01/05 08:11

sql serverのバージョンを教えてください。
sollalice

2018/01/05 08:16

SQL server2014です。よろしく御願いします。
yambejp

2018/01/05 08:20

「ひと塊になったCode 0の最後のレコード」の意図がいまいちわからないのですが、たんに日付ごとにcode0の中で最大の時間を得たいのでしょうか?
sollalice

2018/01/05 08:24

日付で、というよりどのタイミングで来るかが分からない=一日に2回Code 0の塊が来る可能性もあり、各々の最後のCode 0を取得したいです。よろしく御願いします。
yambejp

2018/01/05 08:27

すみません、私が思い違いをしているような気もしますが、そうなると2018/01/01 00:00:00や2018/01/02 05:05:00 はなぜ対象になっていないのでしょうか?
sollalice

2018/01/05 08:29 編集

質問の意図として、Code 0は機械の校正で、予備校正の後、本校正を行います。本校正というのがひと塊の中の最後のCode 0なので、ここがデータ計算の始点となる部分という事で捕まえたいと考えています。よろしく御願いします。
guest

回答3

0

ベストアンサー

起点となるのは正分(ss=00)のcode='0'で、一分以内のcode='0'のもので最終
という条件として以下

SQL

1create table tbl(date_time datetime, code varchar(1)); 2insert into tbl values 3 ('2018/01/01 00:00:00', '0') 4,('2018/01/01 00:00:10', 'A') 5,('2018/01/01 00:00:20', '0') 6,('2018/01/01 00:00:40', '0') 7,('2018/01/01 00:00:50', 'A') 8,('2018/01/01 00:01:00', '3') 9,('2018/01/01 00:01:10', '4') 10,('2018/01/01 00:01:20', '5') 11,('2018/01/01 00:01:30', '6') 12,('2018/01/01 00:01:40', '7') 13,('2018/01/01 00:01:50', '8') 14,('2018/01/01 00:02:00', '9') 15,('2018/01/01 00:02:10', '1') 16,('2018/01/01 00:02:20', '2') 17,('2018/01/02 05:05:00', '0') 18,('2018/01/02 05:05:30', 'A') 19,('2018/01/02 05:05:55', '0') 20,('2018/01/02 05:06:00', '1') 21;

SQL

1select * from tbl 2where code='0' 3 and date_time in ( 4 select max(t1.date_time) 5 from tbl t1 inner join ( 6 select date_time start_range, dateadd(mi,1, date_time) end_range 7 from tbl 8 where format(date_time,'ss')='00' and code='0' 9 ) as t2 10 on t1.date_time>t2.start_range and t1.date_time<t2.end_range 11 where t1.code='0' 12 group by t2.start_range, t2.end_range 13 )

投稿2018/01/05 10:01

編集2018/01/05 10:12
sazi

総合スコア25195

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

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

0

「ひと塊になったCode 0の最後のレコード」の定義が難解に見えます。
一応「前のcode0から1分未満で再度でたcode0はそのグループに属する」とします。

正直合っているのかどうかわからない上に効率の悪いクエリにならざるを得ません。
ほかにデータがあれば利用したいところです…

sql

1select * 2from ( 3 select * 4 ,case when lag(日時) over(order by 日時)>dateadd(MINUTE,-1,日時) then 1 else 0 end as5 ,case when isnull(lead(日時) over(order by 日時),日時+1)>dateadd(MINUTE,1,日時) then 1 else 0 end as6 from test 7 where コード='0' 8) as A 9where=1 and=1 10order by 日時

多分これでいけると思いますが…仕組みはcode=0抽出後
・日時順で見た場合、前の日時が現在の日時の1分未満ならば1を立てる
・日時順で見た場合、次の日時が現在の日時の1分以上ならば1を立てる
・両方1のもののみ表示

投稿2018/01/05 08:46

sousuke

総合スコア3828

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

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

sousuke

2018/01/05 08:49

いつの間にか1日制限がありそうです…1日制限があれば1分制限より大分楽なんですが。
sollalice

2018/01/05 09:01

やりたいことが、校正完了時のデータを基準にして、以降のデータと演算するというもので、設備の関係上、一日に何回校正がかかるか分からない、校正1回目~測定、校正2回目~測定、校正x回目~測定というデータの並びなので、校正を捕まえると、どのデータからどのデータまでが計算対象かが決まる、という意図です。
sousuke

2018/01/05 09:09

校正完了のデータは列にないのですか?「1日に何回校正がくるかわからない」とありますが 1日の中で1分以上の離れたデータが2箇所以上存在した場合いくつ取ればいいのですか?1日に複数回取りたいデータがあるのかどうかが示された方がよろしいかと。また必ず連続するのかどうかが気になります。 連続しないデータで必要なものがあるならば自分のロジックは破綻します。
sollalice

2018/01/05 09:30 編集

校正完了というのがCode 0とCode Aの交互(測定器1と測定器2の校正)で、その交互に出たCode 0(とCode A、簡単に考える為に今回Code Aの求め方は同じロジックと考えているので質問にあげていませんでした)の最後が校正完了です(校正完了の特別コード等はありません)。何度か測定をしているうちに誤差が溜まるのでそのために校正をする関係で一日に複数回校正をする可能性があります。校正1回目~測定、校正2回目~校正2回目以降の測定、校正x回目~校正x回目以降の測定という流れなので、校正1回目~測定で1日終わることもあれば、一日x回の校正が掛かる可能性もあります。校正、測定、2回目校正、2回目校正以降の測定、3回目校正、3回目校正以降の測定データが連続してレコードに入ってくるので、それを校正から2回目の校正がかかるまでのデータひとまとめ、2回目校正から3回目校正がかかるまでのデータひとまとめ、x回目校正からx+1回目校正がかかるまでのデータひとまとめと分離したいのです。 校正が約1分弱かかり(1分以内に連続するCode 0が校正完了で測定基準)、その測定基準から次の測定機順までのデータを収集、演算したいと考えています。
sousuke

2018/01/05 09:45

つまり1日に複数の「ひと塊」はあり得て、それでその「ひと塊」の最後を取得したいということですね? 一回で完了することはあるかどうかに関してはどうなのですか?
sollalice

2018/01/05 10:05

必ず連続するものとして扱って頂いて大丈夫です。
sousuke

2018/01/05 11:05

仮に「2018/01/01 00:01:10 0」というデータがある場合これは「2018/01/01 00:00:00 0」からの連続とみなせますか? それと『1日に複数の「ひと塊」はあり得る』に関しては明言いただかないと私含め他の回答者が先に進めません。
sollalice

2018/01/06 01:35

一日に複数のひと塊はありえます。また、ひと塊が連続して発生することはありません。よろしく御願いします。
guest

0

やりたいことは、
コードが0のレコードで日付毎に最後の時間のレコードを取得したい
ということであっていますか。

あまり複雑なSQLでないのであれば、
疑似的な日付(yymmdd)の列を作って、
日付(yymmdd)でグループ化して最大の日時(yyyy/mm/dd hh:mm:ss)を取得するのが、
一般的で分かりやすいかと思います。

SQL

1SELECT MAX(Date) FROM ( 2 SELECT Date, CONVERT(NVARCHAR, Date, 12) AS yymmdd FROM table WHERE Code = 0 3) 4GROUP BY yymmdd;

※未実行です

投稿2018/01/05 08:32

szk.

総合スコア1400

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問