VBSを使用して、日付毎にcsvファイル内の各ユーザの最も早い日時を持つレコードを出力させたいと思っています
ADODBを使用してcsvからレコードの抽出を行っているのですが、
狙った結果が出力されません
(失敗したコード①・②)
どのように記載すればよいのでしょうか?
(Oracleで使用されているSQL(PLSQL)の形式では使用できないSQL分があるのでしょうか?)
CSVファイル:log_master1.csv
コンピューター名,日時,操作種別,期間,端末機No,端末機名
PC1,2019/2/6 9:56,終了,0:00:05,1,吉田1
PC1,2019/2/6 9:56,開始,0:00:05,1,吉田1
PC1,2019/2/6 9:23,終了,0:05:08,1,吉田1
PC1,2019/2/6 9:18,開始,0:05:08,1,吉田1
PC2,2019/2/6 15:18,継続,2:19:53,15,田中2
PC2,2019/2/6 12:01,終了,1:27:49,15,田中2
PC2,2019/2/6 10:33,継続,1:27:49,15,田中2
PC1,2019/2/8 8:56,終了,1:00:05,1,吉田1
PC1,2019/2/8 8:23,継続,1:05:08,1,吉田1
PC1,2019/2/8 8:18,継続,1:05:08,1,吉田1
PC2,2019/2/8 14:58,開始,2:19:53,15,田中2
PC2,2019/2/8 14:06,終了,1:00:44,15,田中2
PC2,2019/2/8 11:33,開始,1:27:49,15,田中2
目標:このように出したい :logon_master1.csv
日付,起動時間,端末機名,操作種別
2019/2/6,9:18:00,吉田1,開始
2019/2/6,10:33:00,田中2,継続
2019/2/8,8:18:00,吉田1,継続
2019/2/8,11:33:00,田中2,開始
各日付毎の端末機名単位で、最も早い時刻のレコードのみを抽出し、
「日付」「起動時間」「端末機名」「操作種別」
を出力させたい
現在、正常に完了しているコード
sub on_time()
Dim objADO
Dim strPath
strPath = "C:\TESTCSV"
Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
strPath & ";ReadOnly=0"
objADO.Execute _
"SELECT Format([日時],'yyyy/mm/dd') , Format(min([日時]),'hh:nn:ss') AS ontime, 端末機名 " & _
" INTO logon_master.csv " & _
" FROM log_master1.csv " & _
" GROUP BY Format([日時],'yyyy/mm/dd') , 端末機No , 端末機名 ;"
objADO.Close
Set objADO = Nothing
end sub
上記の状態では、「操作種別」カラム以外を、条件通りに抜出が成功している
失敗したコード①
sub on_time()
Dim objADO
Dim strPath
strPath = "C:\TESTCSV"
Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
strPath & ";ReadOnly=0"
objADO.Execute _
"SELECT Format(max([日時]),'hh:nn:ss') AS ontime, 端末機名 , 操作種別 " & _
" INTO logon_master.csv " & _
" FROM log_master1.csv " & _
" INNER JOIN (SELECT 操作種別 , max(ontime) as MAXlogon from log_master1.csv " & _
" GROUP BY Format(max([日時]),'hh:nn:ss') ,端末機No , 端末機名) as master2 on 操作種別 = master2.操作種別 and ontime = master2.MAXlogon;"
objADO.Close
Set objADO = Nothing
end sub
⇒「結合式がサポートされていません」とエラーが出ます
失敗したコード②
sub on_time()
Dim objADO
Dim strPath
strPath = "P:\日本製粉csv\aaa\vbs"
Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
strPath & ";ReadOnly=0"
'objADO.Execute _
'"SELECT Format(max([日時]),'hh:nn:ss') AS ontime, 端末機名 , 操作種別 " & _
'" INTO logon_master.csv " & _
'" FROM log_master1.csv " & _
'" INNER JOIN (SELECT 操作種別 , max(ontime) as MAXlogon from log_master1.csv " & _
'" GROUP BY Format(max([日時]),'hh:nn:ss') , 端末機No , 端末機名) as master2 on 操作種別 = master2.操作種別 and ontime = master2.MAXlogon;"
objADO.Execute _
"SELECT Format([日時],'yyyy/mm/dd') , Format(min([日時]),'hh:nn:ss') AS ontime, 端末機名 , 操作種別" & _
" INTO logon_master.csv " & _
" FROM log_master1.csv " & _
" GROUP BY Format([日時],'yyyy/mm/dd') , 端末機No , 端末機名 , 操作種別;"
objADO.Close
Set objADO = Nothing
end sub
⇒処理は成功するのですが、以下の結果となります
logon_master1.csv
日付,起動時間,端末機名,操作種別
2019/2/6,9:41:00,吉田1,継続
2019/2/6,9:23:00,吉田1,終了
2019/2/6,9:18:00,吉田1,開始
2019/2/612:05:00,田中2,開始
2019/2/612:01:00,田中2,終了
2019/2/610:33:00,田中2,継続
・・・2/8分についても続いて記載される
⇒操作種別ごとに出てしまいます
group by を使用せずに、ユーザーごとに最も早い時刻([日時]カラムの最小値)を抽出する方法があるのでしょうか?
あるいは、コードにミスがあるのでしょうか?
お分かりになられる方、申し訳ございませんが
ご教授のほど、よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。