选择语句以返回已过滤的三列上具有重复项的更新表

时间:2016-09-29 10:27:03

标签: sql sql-server sql-server-2008 tsql

什么select语句将返回下表中的更新表,其中已过滤掉所有三列上重复的行。

ID      Date                        Username    
2368    2012-01-31  00:00:00        asmith  
2368    2012-08-23  00:00:00        asmith  
3151    2012-01-05  00:00:00        asmith  
3151    2012-01-11  00:00:00        asmith  
3151    2012-01-11  00:00:00        asmith  
3171    2012-02-01  00:00:00        asmith  
3412    2012-03-27  00:00:00        asmith  
3420    2012-03-19  00:00:00        asmith  
3423    2012-07-12  00:00:00        asmith  
3431    2012-04-04  00:00:00        asmith  
3460    2012-03-10  00:00:00        asmith  
3519    2013-12-17  00:00:00        asmith  
3539    2012-05-21  00:00:00        asmith  
3541    2012-07-03  00:00:00        asmith  
3572    2012-03-22  00:00:00        asmith  
3572    2012-03-24  00:00:00        asmith  
3572    2012-03-25  00:00:00        asmith  
3572    2012-03-25  00:00:00        asmith  

因此,在删除了ID值3151和3572的重复项后,结果表将如下所示。

ID      Date                        Username    
2368    2012-01-31  00:00:00        asmith  
2368    2012-08-23  00:00:00        asmith  
3151    2012-01-05  00:00:00        asmith
3171    2012-02-01  00:00:00        asmith  
3412    2012-03-27  00:00:00        asmith  
3420    2012-03-19  00:00:00        asmith  
3423    2012-07-12  00:00:00        asmith  
3431    2012-04-04  00:00:00        asmith  
3460    2012-03-10  00:00:00        asmith  
3519    2013-12-17  00:00:00        asmith  
3539    2012-05-21  00:00:00        asmith  
3541    2012-07-03  00:00:00        asmith  
3572    2012-03-22  00:00:00        asmith  
3572    2012-03-24  00:00:00        asmith

2 个答案:

答案 0 :(得分:3)

USE Row_NUMBER

;WITH CTE AS (
  select id, date, username,ROW_NUMBER() OVER (PARTITION BY id,Date ORDER BY ID) RN 
  from TABLE
)
SELECT * FROM CTE WHERE RN=1

执行此操作的替代方法

select id, date, username
from TABLE
GROUP BY id, date, username
HAVING COUNT(*) = 1

答案 1 :(得分:0)

使用以下脚本。

;with cte_1 
 as 
 (SELECT COUNT(CareID)OVER(partition by CareID, TreatDate, Username order by CareID) CNT,* 
                FROM  tmpHANAPATH_Treatments WHERE Username = @Username) 
    SELECT * FROM cte_1 
    WHERE CNT=1