如果找到用户,则选择最后一行。

3

我有一个在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. 编号0282的人仅参与了155个问题。
  3. 编号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
    

    然而,它仅匹配最后一行。

你所需要的是一个简单的WHERE子句;你已经尝试过哪些方法但是没有起作用呢? - Kieren Johnstone
这些简单的查询返回了太多的行,我只想要唯一的ProblemID。 - GEMI
最后一行始终显示错误的当前状态。 - GEMI
为什么900既涉及到155又涉及到159,你在决定时是如何考虑ProblemCode的。 - sll
4个回答

1

这将为您提供所有在其最后一行中具有problemCode = 1的0900个人处理的问题。我无法测试它,因此可能会出现一些错误。

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)

请审核第三个查询。 - phil
是的,这个查询可以找到ID,但是无法按最后一行进行过滤。例如,如果我只想查找ProblemCode在最后一行为1的错误... - GEMI
你可以试试最后一个。可能是因为这只是一个简单的查询添加,我误解了你想做什么。 - phil
说实话,我正在使用Oracle,所以我不确定MSSQL语法。但是,“unique”是指您在OP中发布的字段“unique”。如果是这种情况,可以将其替换为正确的列名。 - phil
我认为这是可以接受的答案,直到有更好的答案出现! - GEMI
显示剩余3条评论

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

我猜只要稍作调整就可以了。虽然这并没有直接检查特定错误的最后一行是什么... - GEMI
@GEMI:是的,它不检查,因为对我来说ProblemCode的整个逻辑都不清楚。如果您可以在PersonId = 900的示例上澄清它,那将是很好的。 - sll
这更像是特定错误的最后一步操作。如果错误155已关闭,则创建一个带有数字1的行。如果错误被重定向,则创建一个带有数字9的行。因此,为了及时了解某些事情,我需要能够过滤这些最后一行。 - GEMI
所以您只需要具有 ProblemCode = 1 的条目? - sll
我需要能够指定ProblemCode。例如,WHERE ProblemCode <> 4或ProblemCode = 9等等。 - GEMI

0

也许这个查询可以帮助:

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

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


在这种情况下,您可以使用 x in (ResponsibleID, AssignedToID) - abatishchev
使用IN版本确实可以工作。但我不会使用它。人们更熟悉“变量IN(常量,常量)”,使用这个版本不会提供任何性能优势。这并不是错误的,我也不认为它是不好的,我只是认为使用OR更为熟悉,所以我会优先使用它。 - MatBailie

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

谢谢,这很好,但没有考虑到最后一个问题代码的错误。 - GEMI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接