2011-11-04 33 views
3

場景:
想象一下,一個表是這樣的:TSQL:獲取最後一個用戶的每一種情況下...一個記錄X的用戶僅

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 

問題:
我該如何與最後一個用戶ONE案件記錄分配?

因此,如果一個用戶已被分配,它將自動覆蓋該案例中的所有以前的用戶。

事情是這樣的:

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 

在這種情況下,用戶1已分配給3例,用戶2 2例,但一個被覆蓋用戶1,用戶3有1例,它沒有覆蓋用戶4 ...等等User4沒有得到任何情況..因此它不會出現在列表中。

注意BENE
理想情況下,我們應該得到的結果..as多條記錄,因爲是在原表案例!

回答

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 
+0

我不得不編輯我的第一篇文章,因爲我不清楚,我需要得到儘可能多的記錄,因爲有這種SQL我得到許多記錄...用戶。 –

+0

這是正確的語法和結果。問題發生了變化,所以這個結果不再正確 –

+0

我同意......這個答案是返回正確的結果,但問題居住在我身邊,我錯誤地表達了這個問題。 –

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 
+0

我已經更新了最初的職位,因爲它並沒有明確。有了這個查詢,如果原始表有1000條記錄,我得到1000條記錄結果集。 –

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 
) 
相關問題