情景:
想象一下像这样的表:
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的许多记录!!!
答案 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
)