0

質問の一般的なタイトルで申し訳ありませんが、他にどのように言えばいいのかわかりませんでした..だからここに行きます:

次の情報を保持する単一のテーブルがあります。

computerName | userName |           date          | logOn | startUp
             |          |                         |       |
ID_000000001 |  NULL    | 2012-08-14 08:00:00.000 |  NULL |   1
ID_000000001 |  NULL    | 2012-08-15 09:00:00.000 |  NULL |   0
ID_000000003 | user02   | 2012-08-15 19:00:00.000 |   1   |  NULL
ID_000000004 | user02   | 2012-08-16 20:00:00.000 |   0   |  NULL

computername と username は自明だと思います

logOnユーザーが1マシン0にログオンしたときとログオフしたときです。

startUp1マシンの電源を入れ0たときと電源を切ったときです。

NULLログインと起動を同時に行うことはできないため、他のエントリは常にそれぞれです。

ここでの私のタスクは次のとおりです:先月 (または任意の時間、ただしここでは 1 か月としましょう) で最も電源が入っていないコンピューターを見つけます。これは SQL でも可能です? <-- 注意: PC の電源がオンになった回数を知る必要はありませんが、指定された時間間隔で各コンピューターの電源がオンになった時間/分を知る必要があります

2 つの小さな問題もあります。

これらのイベントをログに記録するスクリプトが最近インストールされたため、各コンピューターの最初のエントリが列にあるとは言えませ。したがって、ログを開始したときに既にコンピューターが実行されていた可能性があります。1startUp

たとえば、プラグを抜いてコンピューターが強制的にシャットダウンされた場合、シャットダウンのログはなく、その可能性があるため、エントリがすべて交互に 1 と 0 になるという列のみを表示する場合は想定できません。 1 が 2 つ連続します。datestartUp

編集:userNameもちろん、値がある場合は NULLstartUpです。これは、電源を入れたりシャットダウンしたりしても、どのユーザーがそれを行ったかがわからないためです。

4

5 に答える 5

1

ストアド プロシージャで、カーソルとフェッチ ループを使用。そして、temptable を使用して、稼働時間をコンピューター名で保存します。主な計画を示します。詳細については、 TSQL ガイドを参照してください。

別のリンク: TSQL Cursor の良い例

 DECLARE @total_hour_by_computername    
declare @computer_name varchar(255)
declare @RowNum int

 --Now in you ComputerNameList cursor, you have all different computernames:
declare ComputerNameList cursor for
select DISTINCT computername from myTable

-- We open the cursor
OPEN ComputerNameList

     --You begin your foreach computername loop :
    FETCH NEXT FROM ComputerNameList 
    INTO @computer_name
    set @RowNum = 0 
    WHILE @@FETCH_STATUS = 0
    BEGIN

     SET @total_hour_by_computername=0;

     --This query selects all startup 1 dates by computername order by date.
     select @current_date=date from myTable where startup = 1 and computername = @computername order by date

         --You use a 2nd loop on the dates that were sent you back: 

         --This query gives you the previous date 
         select TOP(1) @previousDate=date from myTable 
         where computername = @computername and date < @current_date and startup is not null
         order by date DESC


         --If it comes null, you can decide not to take it into account.
         --Else
         SET @total_hour_by_computername=@total_hour_by_computername+datediff(hour, @previousDate, @current_date);

    --Once all dates have been parsed, you insert into your temptable the results for this computername

    INSERT INTO TEMPTABLE(Computername,uptime) VALUES (@computername,@total_hour_by_computername)

--End of the @computer_name loop
  FETCH NEXT FROM ComputerNameList 
    INTO @computer_name
END
CLOSE ComputerNameList
DEALLOCATE ComputerNameList

どのコンピューターが最も長く稼働しているかを判断するには、temptable への選択のみが必要です。

于 2012-08-29T09:52:40.933 に答える
1

RoadWarrior が指摘したように、シャットダウン メッセージがドロップされた場合、正確なレポートは不可能です。しかし、ここでは何か有用なものを生成する試みがあります。テーブル名はcomputers次のとおりです。

SELECT c1.computerName,
       timediff(MIN(c2.date), c1.date) as upTime
FROM computers as c1, computers as c2
WHERE c1.computerName=c2.computerName
  AND c1.startUp=1 AND c2.startUp=0
  AND c2.date >= c1.date
GROUP BY c1.date
ORDER BY c1.date;

これにより、コンピューターが使用されていたすべての期間のリストが生成されます。要求されたレポートを生成するには、上記のクエリをサブクエリとして使用できます。

SELECT
  c3.computerName,
  SEC_TO_TIME(SUM(TIME_TO_SEC(c3.upTime))) AS totalUpTime
FROM
  (SELECT c1.computerName,
          timediff(MIN(c2.date), c1.date) AS upTime
   FROM computers AS c1, computers AS c2
   WHERE c1.computerName=c2.computerName
     AND c1.startUp=1 AND c2.startUp=0
     AND c2.date >= c1.date
   GROUP BY c1.date
   ORDER BY c1.date
  ) AS c3
GROUP BY c3.computerName
ORDER BY c3.totalUpTime;
于 2012-08-29T09:52:59.453 に答える
1

コンピューターごとにグループ化し、特定の月のスタートアップをフィルタリングする場所を使用できます。

select  computerName
,       count(*)
from    YourTable
where   '2012-08-01' <= [date] and [date] < '2012-09-01' 
        and startup = 1
group by
        computerName
order by
        count(*) desc
于 2012-08-29T09:17:03.640 に答える
0

(最後の段落ごとに)すべてのシャットダウンイベントを記録していない場合。その場合、各コンピューターの電源がオンになっている時間を示すレポートを生成するために利用できる情報がありません。コンピューターのシャットダウンのすべてのインスタンスを記録しているわけではないため、使用するSQLクエリは関係ありません。

FWIW、このスキーマは3NFではありません。より一般的なアプローチは、各イベントを記録する単一の列を作成することです。次に例を示します。

ComputerId:UserId:EventId:EventDate

最初の3つの列はそれぞれ、詳細が格納されている別のテーブルへの外部キーです。このスキーマを使用しても、起動/シャットダウンイベントのUserIDはnullになります。

于 2012-08-29T09:27:53.757 に答える
0

table_name次のクエリを試してください (テーブルの名前に置き換えてください)。

SELECT SUM(startUp) AS startupTimes 
FROM table_name
GROUP BY computerName
ORDER BY startupTimes

これにより、各コンピューターが起動された回数が出力されます。最初の行 (起動回数が最も少ないコンピューター) だけを取得するにはLIMIT 1、クエリに追加します。

于 2012-08-29T09:17:12.250 に答える