Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Microsoft 365)
接続数が多い時間と台数を求めたい
投稿日時: 23/05/17 16:02:04
投稿者: jimusyo

お世話になります。
 
データ(テーブル)として
・日付時刻型 2023/5/17 13:00:00
・装置名(テキスト型)
・接続状況(数値型)  ※1がONになったとき、0がOFFになったとき
のデータがございます。
 
データの例として
2023/5/16,9:10:20,装置A,1
2023/5/16,10:00,30,装置B,1
2023/5/17,15:30:00,装置C,1
2023/5/17,18:00:00,装置A,0
2023/5/17,20:00:00,装置C,0
2023/5/17,23:00:00,装置D,1
 
上記例ですと、2023/5/17,15:30:00,装置CがON(1)になったときが、
一番接続数が多い事になり、欲しい答えとしては一番多い接続時の
日時、台数が欲しいです。
2023/5/17,15:30,00,3(3台)
 
答えで欲をいうならば、
2023/5/17,15:30,00,3(3台),装置A,装置B,装置C
と、台数+接続している装置名なども欲しいのですが、
このような答えを出す事は可能でしょうか。
 
よろしくお願いします。

回答
投稿日時: 23/05/18 10:12:46
投稿者: hatena
投稿者のウェブサイトに移動

かなり複雑なクエリになりそうですが、可能だと思います。
 
とりあえずヒントだけ。
 
まず、現状のテーブル構成だと難しそうなので、下記のようなテーブル構成に変換します。
 

装置,起動時刻,停止時刻
---------------------------------
装置A,2023/5/16 09:10:20,2023/5/17 18:00:00
装置B,2023/5/16 10:00,30,
装置C,2023/5/17 15:30:00,2023/5/17 20:00:000
装置D,2023/5/17 23:00:00,

 
そのうえで、下記で紹介している方法を参考にクエリを作成すればいいでしょう。
 
クエリで期間内最大在室数を求める - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-281.html

投稿日時: 23/05/18 10:47:19
投稿者: jimusyo

hatena様
 
ご回答いただき、ありがとうございます。
 
すみません。私誤った伝え方してました。
 
欲しい結果はテーブルの日付(年月日:時:分:秒)範囲(約3か月分)にて、
どの日付のどの時間が最大ONになったかということで、
1日に何度もON・OFFになったりするのもございます。
 
クエリでは難しそうなので、ベタですが
先頭レコードから読み取って、変数に日付やらを入れていく感じで
作ろうかと思っております。
 
上記で解決できそうでしたら、解決済みとさせていただきます。

回答
投稿日時: 23/05/18 11:54:28
投稿者: sk

・全ての装置において、接続と切断を 1 回ずつ繰り返すサイクルは絶対である。
 (例えば「接続」のログが 2 回以上連続して記録されるということはない)
 
・1 つの装置において、全く同一の日時に接続と切断が同時に実行されるケースは
 存在しない。
 
以上の前提が保証されているのであれば、とりあえず次のようなクエリを
作成なさればよろしいのではないかと。
 
( SQL ビュー)
---------------------------------------------------------------
SELECT [通信記録テーブル].[記録日時],
       [通信記録テーブル].[装置名],
       [通信記録テーブル].[接続状況],
       Count(*) AS [接続中の件数]
FROM [通信記録テーブル],
     (SELECT tmp1.[装置名],
             tmp1.[記録日時] AS [接続日時],
             (SELECT MIN(tmp2.[記録日時])
              FROM [通信記録テーブル] tmp2
              WHERE tmp2.[装置名] = tmp1.[装置名]
                AND tmp2.[記録日時] > tmp1.[記録日時]
                AND tmp2.[接続状況] = 0) AS [切断日時]
      FROM [通信記録テーブル] tmp1
      WHERE tmp1.[接続状況] = 1) qry
WHERE [通信記録テーブル].[記録日時] >= qry.[接続日時]
  AND [通信記録テーブル].[記録日時] < Nz(qry.[切断日時], #9999/12/31 23:59:59#)
GROUP BY [通信記録テーブル].[記録日時],
         [通信記録テーブル].[装置名],
         [通信記録テーブル].[接続状況]
ORDER BY [通信記録テーブル].[記録日時],
         [通信記録テーブル].[装置名];
---------------------------------------------------------------

投稿日時: 23/06/08 16:19:16
投稿者: jimusyo

sk様
 
ご回答が大変遅くなり、申し訳ございませんでした。
 

引用:

・全ての装置において、接続と切断を 1 回ずつ繰り返すサイクルは絶対である。
 (例えば「接続」のログが 2 回以上連続して記録されるということはない)
  
・1 つの装置において、全く同一の日時に接続と切断が同時に実行されるケースは
 存在しない。

 
はい。そのとおりとなり、教えていただいた内容にて、欲しいデータを
取得する事ができました。
 
大変ありがとうございました。