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

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

ただいまの
回答率

91.27%

  • SQL

    1750questions

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

  • SQL Server

    442questions

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

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

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 68

sollalice

score 10

お世話になります。
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でそのような記述ができるものかも分かりません。
その際のクエリ、そもそもそのような記述ができるものなのか、御教示ください。
よろしく御願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sollalice

    2018/01/05 17:24

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

    キャンセル

  • yambejp

    2018/01/05 17:27

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

    キャンセル

  • sollalice

    2018/01/05 17:29 編集

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

    キャンセル

回答 3

0

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

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

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


※未実行です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

select *
from (
    select *
        ,case when lag(日時) over(order by 日時)>dateadd(MINUTE,-1,日時) then 1 else 0 end as 前
        ,case when isnull(lead(日時) over(order by 日時),日時+1)>dateadd(MINUTE,1,日時) then 1 else 0 end asfrom test
    where コード='0'
) as A
where 前=1 and 後=1
order by 日時


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 17:49

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

    キャンセル

  • 2018/01/05 18:01

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

    キャンセル

  • 2018/01/05 18:09

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

    キャンセル

  • 2018/01/05 18: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が校正完了で測定基準)、その測定基準から次の測定機順までのデータを収集、演算したいと考えています。

    キャンセル

  • 2018/01/05 18:45

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

    キャンセル

  • 2018/01/05 19:05

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

    キャンセル

  • 2018/01/05 20:05

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

    キャンセル

  • 2018/01/06 10:35

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

    キャンセル

0

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

create table tbl(date_time datetime, code varchar(1));
insert into tbl values
 ('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')
;
select * from tbl
where   code='0'
   and  date_time in (
          select max(t1.date_time)
          from tbl t1 inner join (
              select date_time start_range, dateadd(mi,1, date_time) end_range 
              from tbl
              where format(date_time,'ss')='00' and code='0'
            ) as t2
            on t1.date_time>t2.start_range and t1.date_time<t2.end_range
          where t1.code='0'
          group by t2.start_range, t2.end_range
        )

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.27%

関連した質問

  • 解決済

    MYSQLで最初の行のみ値を表示したいです。

    こんにちは。  次のようなテーブルから重複しない値を最初の1行のみ表示したいと思います。 下のリンクからテーブルの構造とクエリを試すことができます。 http://sqlfi

  • 解決済

    MySQL 最新5件を除いて削除

    PHP の PDO で 最新5件を除いて 全てのデータを削除したいです。 全件数取得 古いものから(全件数-5)件を削除 上記のような 考えは浮かんだのですが

  • 解決済

    mysqlで週次のラベルを作成

    mysqlを使ってデータの集計を行っています。 そこで、毎週月曜日の日付をラベルにして、 ('2016-05-09'のように) 一週間分の売上データを集計したいと思っています

  • 解決済

    phpの掲示板で最初のデータだけ表示されない

    phpで掲示板を作成しました。 フォームでmysqlのテーブルにデータを送信し、その内容を取ってきて一度配列に入れて、100件づつ、日付順に表示する、というものです。 しかし、

  • 解決済

    mysqlで週別の集計をしたいです

    前提・実現したいこと 最近になりMySQLの勉強を始めて問題集を解いているのですが週別集計で詰まってしまいました 以下が詰まっている問題です 各プロジェクトの人件費を週別に

  • 解決済

    SQL で 日付単位でデータを取得する

    SQLで質問です。 日単位で表示、同日の場合、同日時刻が最終のモノを抽出 を行いたいです。ご教授お願いします。 テーブル id date log_id 1 2

  • 解決済

    JavaScriptの書き方

    JavaScript超初心者です。 大変お手数ですが、ご教授頂きたいです。 年始(year)にJSの切り替え、 さらに1/4(date)にJSを切り替えたいのですが書き方がわか

  • 解決済

    javascript で曜日ごとのコンテンツ切り替えに祝日設定を加えたい

    前提・実現したいこと 現在javascriptで組んだWebページ用の曜日ごとのコンテンツ切り替えに祝日お盆休み等を手入力で追加設定したい。 該当のソースコード <script

同じタグがついた質問を見る

  • SQL

    1750questions

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

  • SQL Server

    442questions

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