2011-10-28 4 views
3

SQL Serverにログテーブルがあります。テーブルは次のように構成されています。USERが見つかった場合は最後の行を選択

Unique ProblemID ResponsibleID AssignedToID ProblemCode 

155  155  0282       4 
156  155      0900 
157  155          3 
158  155      0147   1 
159  159  0111       2 
160  159      0333   4 
161  159  0900       1 

基本的に私たちはすべての問題を記録し、誰が責任を負い、問題に対処しなければなりませんでした。 私は一人が関与している問題を見つけるでしょうクエリ必要があります。たとえば

を:

  1. ID 0900の人がID 0282を持つ人が関与していた
  2. 155と159の両方に関与していました155でのみ。
  3. ID 0333の人物は159人だけに関係していました。

また、私はProblemCodeによってProblemIDの最後の行をフィルタリングする必要があることを忘れていました。たとえば、人が関わっている問題IDを見つけてください。その問題の最後のログ行にProblemCodeが1(問題が現在クローズしていることを意味します)です。

はさらに、私は、クエリで働いていた:

select ProblemID, EntryTime, ResponsibleID, ProblemCode, AssignedToID 
    from (select ProblemID, EntryTime, ResponsibleID, ProblemCode, AssignedToID, 
    row_number() over(partition by ProblemID order by EntryTime desc) as rn 
    from myTable) as T 
    where rn = 1 and ResponsibleID = '00282' OR AssignedToID = '00282' 
    and veiksmoid <> 4 

しかし、それだけで、最後の行と一致します。

+0
+0

単純なWHERE句が必要です。あなたはすでに何をしようとしましたか? –

+0

これらの単純なクエリは、あまりにも多くの行を返します。私は一意のProblemIDだけを必要とします。 – GEMI

答えて

1

これは、0900人が処理した問題コードと、最後の行にproblemCode = 1を持つすべての問題を示しています。私はそれがいくつかのエラーがあるかもしれないようにそれをテストすることはできません。

SELECT problemID FROM <table> t1 
WHERE problemID IN (
     SELECT problemID FROM <table> 
     WHERE (ResponsibleID = 0900 OR AssignedToID = 0900)) 
AND problemCode = 1 
AND unique = (SELECT MAX(unique) FROM <table> WHERE problemID = t1.problemID) 
+0

これは私にすべての行を与え、私は唯一のproblemIdを必要とする。 – GEMI

+0

3番目のクエリ – phil

+0

を確認してくださいええ、このクエリはIDの検索には問題ありませんが、最後の行でフィルタリングすることはできません。たとえば、最後の行のProblemCodeが1である間違いだけを見つけたい場合は... – GEMI

0

おそらく、このクエリは助けることができる:

ログ表は、表の名前であり、xが人のIDです
SELECT ProblemID 
FROM LOGTABLE 
WHERE (ResponsibleID = x) OR (AssignedToID = x) 

を。あなたは結果に何をしたい

+0

この場合はおそらく 'x in(ResponsibleID、AssignedToID)' – abatishchev

+0

のINを使うと使えます。しかし、私はそれを使用しません。人々は '変数IN(定数、定数)'に慣れており、このバージョンを使用してもパフォーマンス上の利点はありません。それは間違っていない、私はそれがどちらか悪いとは言わない、私はちょうどORを使用してよりよく知られていると思うので、私は好みで使用したいと思います。 – MatBailie

1
SELECT ag.UserId, ag.ProblemID 
FROM(
    SELECT ProblemID, ResponsibleID as UserId 
    FROM Table 
    WHERE ResponsibleID IS NOT NULL 

    UNION ALL 

    SELECT ProblemID, AssignedToID as UserId 
    FROM Table 
    WHERE AssignedToID IS NOT NULL 
) ag 
GROUP BY ag.UserId, ag.ProblemID 
+0

これはいくつかの調整があると思います。これは、特定の間違いの最後の行にあるものを直接チェックしていませんが... – GEMI

+0

@GEMI:私にとってProblemCodeの全体のロジックが明確でないため、うまくいきません。あなたがPersonId = 900でそれを明確にすることができるなら、それは素晴らしいでしょう。例 – sll

+0

それはその特定の間違いの最後の行動のほうが多いです。間違い155が閉じられた場合、番号1の行が作成されます。間違いがリダイレクトされた場合、番号9の行が作成されます。だから、特定のものを最新のものにするために、私はそれらの最後の行をフィルタリングすることができる必要があります。 – GEMI

0
SELECT distinct problemid 
    from YourTable 
    where 
     (Responsible = 0900 
     OR AssignedToID = 0900) 
     AND ProblemCode <> 1 
+0

ありがとう、これは良いですが、間違いの最後の問題コードを考慮しません。 – GEMI

関連する問題