お世話になります。
「開始時刻」と「終了時刻」を同内容であれば集約したく、いろいろとサイトを巡って調べていると、下記のサイトにたどりつきました。
「開始日付」と「終了日付」で管理しているデータをSQLで期間集約するには?
まさにこれと同じ作業をしたいのですが、上記サイトでは Accessを使用していません。
Accessでやろうと試みましたが、Window関数(分析関数)というものが分からず、全く同じやり方では厳しいのではと悩んでいます。
この作業を別の方法を用いてでもAccessで行いたいですが可能でしょうか?
ご教授の程よろしくお願い致します。
実際のテーブル名、フィールド(名前、データ型)、主キー設定をとりあえず提示してください。
また、
例えば、同内容(連続データ)と判断する基準は、秒まで完全に一致する場合か、あるいは、隣接しているなら連続データと判断するのか。あるいは、重なっている場合があるなら、それも連続データとするのか、など。
早々のご返信ありがとうございます。
内容不足で申し訳ございません。
テーブル名:T_日報マスタ
主務キー:ID
これを
クエリ名:Q_日報マスタ
のような形にしたいと思っています。
前提として
同じ日付の場合、ID番号の「終了」とID番号+1の「開始」は同じ時刻が入ります。
やりたい作業:ID2、3が同じ日付(3/10)、同内容(作業)で9:00~10:00、10:00~15:00と続いているので9:00~15:00にまとめたい
ただし、ID4が違う作業(15:00~16:00に「移動」)なのでID5はまとめない
同内容の判断基準は、同じ日付、作業 でID番号の「終了」とID番号+1の「開始」の時間:分 が一致する場合です。
ご確認よろしくお願い致します。
連続するデータが2つのまでなら、下記のような二段階のクエリでできそうです。
クエリ名 Q_日報1
クエリ名 Q_日報マスタ
3つ以上連続する場合があるとちょっと面倒そうです。
早々のご返信ありがとうございます。
取り急ぎ、3つ以上連続する場合もあります。
省略してしまいましたが、テーブルには下記のような内訳あります。
内容によって3つ以上になる場合があります。サンプルが情報不足で申し訳ございません…
まずはご返信された内容にて確認させていただきます。
追記です。
ご教授していただいた内容で、2つまでなら希望通りのクエリが作成できました。ありがとうございます。
ですが確かに3つ以上はうまくいきません。別の方法が必要なのですね。
同じ日付で内容が連続した場合、そのレコードの中から開始の最小値と終了の最大値を取得するには・・・
Window 関数は、Oracle や SQLServer など本格的なデータベースには標準で搭載されている機能ですが、
Access には移植されておらず、LAG や LEAD といった関数は、模倣するのが難しいですから
「 旅人算 」という手段を用いて実現する方法 をご紹介します。
【 手順1 】
hatenaさんのコンテンツで紹介されている下記の関数を使いますから
ご自身のデータベースに、モジュール( SetSequenceNumber関数 )をインポートしておいてください。
【 手順2 】
T_日報マスタ テーブルに 数値型のフィールドを2つ追加します。
追加するフィールドの名前は
全体連番
グループ連番
とします。
【 手順3 】
追加した2つのフィールドに VBA で連番を振ります。
(
※ 全体連番には、日付 + 開始時刻 の昇順で ユニークな番号を付与します。
※ グループ連番には 日付・内容 を母集団とし、開始時刻の昇順で 集団内での連番を付与します。
)
■ set_number実行前
■ set_number実行後
( 続き )
ここまで出来たら、あとは単純な集計クエリで表現可能です。
■ SQL
■ 結果
mayu様ご返信ありがとうございます。
Window 関数についてや詳細な手順まで載せて頂き大変感謝致します。
(旅人算、面白い名前ですね)
まずはご教授していただいた内容にてトライしてみます。
もし不明点あれば恐縮ですがまた質問させていただきます。
追記です。
手順通り行ったところ、まさに希望通りの表現ができました!
グループ毎連番の記事は以前拝見しましたが、この作業に応用できるという発想には全く至りませんでした。
それに 全体連番 - グループ連番 でグループを作るとは・・・
これならレコード件数が増えても処理が重くなることがなさそうなので二重に助かります。
ご教授いただきありがとうございました。