如果找到USER,则选择最后一行

时间:2011-10-28 09:56:26

标签: sql sql-server tsql sql-server-2008

我在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. 身份证号为0900的人参与了155和159.
  2. ID为0282的人只参与了155人。
  3. 身份证号为0333的人只参与了159人。
  4. 另外我忘了提到我需要通过ProblemCode过滤ProblemID的最后一行。例如,找到涉及人员的problemID,但该问题的最后一个日志行中的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
    

    但是,它只匹配最后一行。

4 个答案:

答案 0 :(得分:1)

这为您提供了一个人0900处理的所有问题,并且在最后一行中遇到问题Code = 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 :(得分: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

答案 2 :(得分:0)

也许这个查询可以提供帮助:

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

其中LOGTABLE是表的名称,x是Person的ID。

答案 3 :(得分:0)

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