0

私はという名前のテーブルを持っていますLogs

 ->OCCUR_TIME --date and time
 ->NAME --name of a person
 ->KIND --the kind of log (eg. 40 means `something`)
 ->VALUE --the value of the kind of log (eg. 99)

クエリを作成する必要があります。

SELECT 
*
FROM        LOGS
WHERE       NAME='dude'
ORDER BY    KIND, OCCUR_TIME, VALUE;

これで、ログが表示され、種類で並べ替えられてから、発生時刻が表示されます(occur_timeがまったく同じ場合は、値で並べ替えられます)。

ノート:

  • KINDの値は常に+1でなければなりません
  • 問題を報告しない場合。

たとえば、ログに問題があり、VALUE 400の後の次のVALUEが398である場合はどうなりますか?

例:

   Occur_Time                | Name    | Kind | Value
   2012-06-26 15:14:25.407     dude      40     398
   2012-06-27 16:55:28.730     dude      40     399
   2012-06-30 02:43:26.763     dude      40     400
   2012-06-30 05:26:32.673     dude      40     398 <-- data prob. (possible rollback)
   2012-06-30 16:35:28.330     dude      40     399 <-- problem continuing
   2012-06-20 20:29:51.207     dude      41     100 <-- no prob. bcoz its another kind
   2012-06-23 05:50:59.130     guy       40     500 <-- no prob. bcoz its another name

問題とその発生場所を見つけるクエリが必要です。このような?

助けてください。ありがとうございました。

4

2 に答える 2

1

理想的なクエリではありませんが、これにより問題がリストされます。

select l1.*, l2.* 
from logs l1 -- self join on the columns that are the same
  inner join logs l2 on l1.Name = l2.Name and l1.Kind = l2.kind
where l1.occur_time > l2.occur_time
  and l1.value < l2.value

基本的に、これによりすべての不一致が検出され、時間が長くなりますが、値は減少します。ただし、発生するたびに多くの重複が返されるため、次のような制限が必要になる場合があります。

select distinct l1.Name, l1.Kind
from logs l1 -- self join on the columns that are the same
  inner join logs l2 on l1.Name = l2.Name and l1.Kind = l2.kind
where l1.occur_time > l2.occur_time
  and l1.value < l2.value

問題のある名前/種類のペアを分離する

于 2012-07-25T13:39:28.557 に答える
0

SQL Server 2012では、これはlag()関数を使用して行います。

以前のバージョンを使用していると仮定しますが、2005年以降です。これは、ネストされたWindows関数を使用して実行できます。

select name, KIND, OCCUR_TIME, VALUE,
       (case when max(testval) over (partition by kind, name) <> min(testval) over (partition by kind)
              then 'FAIL'
              else 'OKAY'
        end) as status
from (SELECT *,
             row_number() over (partition by kind, name order by occur_time, value) as seqnum,
             (value - row_number() over (partition by kind, name order by occur_time, value)) as testval
      FROM LOGS
      WHERE NAME='dude'
     ) t
  ORDER BY name, KIND, OCCUR_TIME, VALUE

アイデアは、row_number()を使用して数列を生成することです。値とシーケンスの違いは一定でなければなりません。外側のクエリは、これらの最小値と最大値を調べます。それらが異なる場合は、問題があります。

于 2012-07-25T13:44:33.320 に答える