2016-07-20 52 views
0

我正在處理一個設計不良的數據庫,只要它們具有不同的唯一標識符,它不會限制重複行。T-SQL:如何從組中獲取最後修改的行

在其中一個表中,給定的用戶可以具有該屬性的屬性和值。通常情況下,一個用戶只會有一次屬性,但由於設計不佳,我在表格中得到了很多重複項,現在我需要清理這些混亂。這是由於CRM軟件並不總是在我們修改員工檔案時檢查該行是否存在,而是創建了一堆具有重複值的新行。

下面的查詢返回的重複值:

SELECT ua.ID AS LineID 
    ,ua.Modified AS LineLastModifiedDate 
    ,u.FullName AS EmployeeName 
    ,a.Name AS AttributeName 
    ,ua.value AS AttributeValue 

FROM UserAttributes AS ua 
    INNER JOIN Users AS u ON ua.userid = u.id 
    INNER JOIN Attributes AS a ON ua.AttributeID = a.ID 

WHERE EXISTS (
    SELECT NULL 
    FROM UserAttributes as ua2 
    WHERE ua2.UserID = ua.UserID 
     AND ua2.AttributeID = ua.AttributeID 
     AND ua2.ID != ua.ID 
    ) 

而產生的結果是:

LineID LineLastModifiedDate EmployeeName AttributeName AttributeValue 
------ ----------------------- ------------- --------------- --------------- 
15  2016-01-01    Employee1  EmployeeNumber 15    
19  2016-07-20    Employee1  EmployeeNumber 15    
35  2016-01-01    Employee2  EmployeeSex  M    
96  2016-07-20    Employee2  EmployeeSex  M    
21  2016-03-03    Employee1  SickDays  3    
99  2016-07-10    Employee1  SickDays  5    

我需要完成從這個查詢開始是:同樣EmployeeName的的ForEach分組和AttributeName,給我最後一個修改後的行,期望如下結果:

LineID LineLastModifiedDate EmployeeName AttributeName AttributeValue 
------ ----------------------- ------------- --------------- --------------- 
19  2016-07-20    Employee1  EmployeeNumber 15    
96  2016-07-20    Employee2  EmployeeSex  M 
99  2016-07-10    Employee1  SickDays  5       

如何修改我的查詢來完成此操作?

謝謝

-M

回答

2
;WITH CTE 
AS 
(
SELECT ua.ID AS LineID 
    ,ua.Modified AS LineLastModifiedDate 
    ,u.FullName AS EmployeeName 
    ,a.Name AS AttributeName 
    ,ua.value AS AttributeValue 
    ,ROW_NUMBER() OVER (PARTITION BY EMPLOYEENAME,EMPLOYEESEX ORDER BY UA.Modified DESC) AS RN 
FROM UserAttributes AS ua 
    INNER JOIN Users AS u ON ua.userid = u.id 
    INNER JOIN Attributes AS a ON ua.AttributeID = a.ID 

WHERE EXISTS (
    SELECT NULL 
    FROM UserAttributes as ua2 
    WHERE ua2.UserID = ua.UserID 
     AND ua2.AttributeID = ua.AttributeID 
     AND ua2.ID != ua.ID 
    ) 
) 
SELECT * FROM cte where rn=1 
+0

這實際上工作得很好。謝謝 ! –

0

您可以使用行編號或方案,如下面你拔出最高值,其中,然後使用連接。據推測,你不能按日期關係。

select ... 
from 
    UserAttributes as ua 
    inner join 
    (
    select 
     UserID, AttributeID, 
     max(LineLastModifiedDate) as MaxLineLastModifiedDate 
    fromUserAttributes 
group by UserId 
    ) as max_ua 
     on  max_ua.UserID = ua.UserID 
      and max_ua.AttributeID = max_ua.AttributeID 
      and max_ua.MaxLineLastModifiedDate = ua.LineLastModifiedDate 
    ... 
相關問題