TSQL:获取每个案例的最后一个用户......仅一个记录x用户

时间:2011-11-04 07:01:03

标签: sql tsql

情景:
想象一下像这样的表:

Auto_INC, UserID_FK, CaseID_FK,    Date
   idX      userX      caseX

当它被填满时,它看起来像这样:

   id1,     user4,     case20,   2010/01/12  
   id2,     user1,     case13,   2010/03/20  
   id3,     user2,     case10,   2010/03/22  
   id4,     user1,     case21,   2011/01/10  
   id5,     user2,      case9,   2011/01/11  
   id6,     user3,     case20,   2011/02/01  
   id7,     user1,      case9,   2011/03/25

问题:
如何获得最终用户分配的一个CASE记录?

因此,如果分配了一个用户,它将自动覆盖该案例中的所有先前用户。

这样的事情:

   id7,     user1,      case9,   2011/03/25  
   id2,     user1,     case13,   2010/03/20  
   id4,     user1,     case21,   2011/01/10
   id6,     user3,     case20,   2011/02/01    
   id3,     user2,     case10,   2010/03/22  

在这种情况下,User1已被分配到3个案例,User2被分配到2个案例但是一个被User1覆盖,User3有1个案例并且它确实覆盖了User4 ...因此User4没有得到任何案例..因此它不会出现在名单上。

注意BENE
理想情况下,我们应该得到结果..原始表上有CASES的许多记录!!!

3 个答案:

答案 0 :(得分:4)

declare @T table
(
  Auto_INC int identity primary key, 
  UserID_FK int, 
  CaseID_FK int,
  [Date] date
);

insert into @T values
(4, 20, '2010/01/12'),
(1, 13, '2010/03/20'),
(2, 10, '2010/03/22'),
(1, 21, '2010/01/10'),
(2, 9,  '2010/01/11'),
(3, 20, '2010/02/01'),
(1, 9,  '2010/03/25');

with C as
(
  select *,
         row_number() over(partition by CaseID_FK 
                           order by [Date] desc) as rn
  from @T
)
select Auto_INC, UserID_FK, CaseID_FK, [Date]
from C
where rn = 1;

结果:

Auto_INC    UserID_FK   CaseID_FK   Date
----------- ----------- ----------- ----------
7           1           9           2010-03-25
3           2           10          2010-03-22
2           1           13          2010-03-20
6           3           20          2010-02-01
4           1           21          2010-01-10

答案 1 :(得分:1)

您可以在同一个表上执行子查询以获取最新用户(以及该用户的日期)。

SELECT DISTINCT T1.CaseID_FK, (SELECT TOP 1 T2.UserID_FK
        FROM Table AS T2
        WHERE T2.CaseID_FK = T1.CaseID_FK
        ORDER BY T2.Date DESC) AS User,
    (SELECT TOP 1 T2.Date
        FROM Table AS T2
        WHERE T2.CaseID_FK = T1.CaseID_FK
        ORDER BY T2.Date DESC) AS Date,
FROM Table AS T1

编辑:

这应该限制为只返回行数。

SELECT *
FROM
    (SELECT T1.CaseID_FK, MAX(T1.Date) AS Date
    FROM Table AS T1
    GROUP BY CaseID_FK) AS T2 LEFT JOIN
    (SELECT *
    FROM Table AS T3) AS T4 ON T2.CaseID_FK = T4.CaseID_FK AND T2.Date = T4.Date

答案 2 :(得分:0)

使用

SELECT * FROM TABLE T WHERE
(T.CASEID_FK, T.Auto_INC) IN
(
SELECT A.CASEID_FK, MAX (A.Auto_INC) MI FROM TABLE A
INNER JOIN (SELECT X.CASEID_FK, MAX (X.DATE) MD FROM TABLE X GROUP BY X.CASEID_FK) Y ON A.DATE = Y.MD AND A.CASEID_FK = Y.CASEID_FK
GROUP BY A.CASEID_FK
)