USERが見つかった場合は最後の行を選択してください

SQL Serverにログテーブルがあります。テーブルは次のように構成されています。

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のユーザーは、155と159の両方に関与していました。
  2. ID 0282の人物は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

ただし、最後の行にのみ一致します。

3
あなたは結果で何をしたいですか?
追加された 著者 rahularyansharma,
あなたが望むのは単純なWHERE句です。あなたはすでに何をしようとしましたか?
追加された 著者 Kieren Johnstone,
最後の行は常に間違いの現在の状態を示します。
追加された 著者 GEMI,
これらの単純なクエリは、私が唯一のProblemIDを必要とする行が多すぎます。
追加された 著者 GEMI,
なぜ、900が155と159の両方で一貫しているのか、あなたが
追加された 著者 sll,
なぜLAST行を選択するのですか?
追加された 著者 sll,

4 答え

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
1
追加された
私はProblemCodeを指定できる必要があります。たとえば、ProblemCode <> 4またはProblemCode = 9など。
追加された 著者 GEMI,
それはその特定の間違いの最後の行為である。間違い155が閉じられた場合、番号1の行が作成されます。間違いがリダイレクトされた場合、番号9の行が作成されます。だから、特定のものを最新のものにするために、私はそれらの最後の行をフィルタリングすることができる必要があります。
追加された 著者 GEMI,
私はこれが行ういくつかの微調整で推測する。これは、特定の間違いの最後の行にあるものを直接確認するものではありませんが...
追加された 著者 GEMI,
@ GEMI:私はProblemCodeの全体のロジックが明確でないため、うまくいけない。あなたがPersonId = 900の例でそれを明確にすることができるなら、それは素晴らしいでしょう
追加された 著者 sll,
したがって、ProblemCode = 1のエントリだけが必要ですか?
追加された 著者 sll,

これは、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)
1
追加された
私は何か良いことが起こるまで、これを受け入れられる答えと見なします!
追加された 著者 GEMI,
これはうまくいくようですが、試してくれてありがとうございますが、これはMSSQLのためのものなのですか?ユニークで構文エラーが出ています。
追加された 著者 GEMI,
最後のクエリの問題は、その前に複数の行に番号1を入れることができるということです。特定の間違いの最後の行だけが重要です。
追加された 著者 GEMI,
うん、このクエリはIDを見つけるのに大丈夫ですが、最後の行でフィルタリングすることはできません。たとえば、最後の行のProblemCodeが1である間違いだけを見つけたい場合は...
追加された 著者 GEMI,
これは私にすべての行を与える、私はユニークなproblemIdが必要です。
追加された 著者 GEMI,
あなたは今、最後のクエリを試すことができます。それはおそらくいくつかの最適化が必要ですが、どこかにあなたを得るかもしれません。
追加された 著者 phil,
あなたは今、最後のものを試すことができますか?これは簡単なクエリの追加なので、あなたがやろうとしていることを誤解している可能性があります。
追加された 著者 phil,
正直言って、私はOracleを使用しているので、MSSQLの構文についてはわかりません。しかし、「一意」とは、あなたがOPに投稿したあなたのフィールド「ユニーク」を指します。それが正しい場合は、正しい列名に置き換えてください。
追加された 著者 phil,
3番目のクエリを確認してください
追加された 著者 phil,
SELECT distinct problemid
   from YourTable
   where 
         ( Responsible = 0900
      OR AssignedToID = 0900 )
      AND ProblemCode <> 1
0
追加された
ありがとう、これは良いですが、ミスの最後の問題コードを考慮に入れません。
追加された 著者 GEMI,

おそらく、このクエリは次のように役立ちます。

SELECT ProblemID
FROM LOGTABLE
WHERE (ResponsibleID = x) OR (AssignedToID = x)

LOGTABLEは表の名前、xはPersonのIDです。

0
追加された
この場合、おそらく x in(ResponsibleID、AssignedToID)の中のどこかを使用することができます。
追加された 著者 abatishchev,
INバージョンを使用すると動作します。しかし、私はそれを使用しません。人々は変数IN(定数、定数)をよく知っており、このバージョンを使用してもパフォーマンス上の利点はありません。それは間違っていない、私はそれがどちらか悪いとは言わない、私はちょうどORを使用してよりよく知られていると思うので、私は好みで使用したいと思います。
追加された 著者 MatBailie,