2017-02-14 202 views
3

我有一個包含日期時間,值和用戶的表。 該表格具有相同日期時間的多行,但具有不同的用戶和值。SQL - 選擇要選擇的重複值

我想選擇不同的日期時間與相應的值和用戶。 如果存在與不同用戶重複的日期時間,則應優先考慮user2輸入的值。

 
Table 1 
----------------- 
DateTime| Value| User 
--------|---------|--------- 
1/1/17 |  10| User1 
2/1/17 |  30| User1 
3/1/17 |  10| User1 
1/1/17 |  90| User2 
2/1/17 |  80| User2  

所以從上面的,我最終會與

 
1/1/17 |  90| User2 
2/1/17 |  80| User2 
3/1/17 |  10| User1 

我敢肯定有一個簡單的答案,但我不能爲我的生活工作怎麼辦它!

任何幫助非常感謝。

謝謝

+0

ü怎麼GT 80日期17年2月1日? –

+0

對不起的打字錯誤,意味着90.將更新。 –

回答

2

不是很簡單!利用窗口函數和公用表表達式

; with x as (
select [DateTime], value, [User], row_num = row_number() over(partition by [DateTime] order by [User] desc) from Table1 
) 
select x.* from x where row_num = 1 
+0

這利用了'User2'>'User1'這個事實,在更一般的設置order by子句中會有所不同。 –

0
DECLARE @T as table 
(
    [DateTime] nvarchar(100), 
    VALUE INT, 
    [USER] VARCHAR(32) 
) 

INSERT INTO @T 
VALUES 
('1/1/17', 10, 'User1'), 
('2/1/17', 30, 'User1'), 
('3/1/17', 10, 'User1'), 
('1/1/17', 90, 'User2'), 
('2/1/17', 80, 'User2') 

SELECT t.[DateTime], t.VALUE, t.[USER] 
FROM @T t 
    JOIN (
     SELECT [DateTime], MAX([USER]) AS [USER] 
     FROM @T 
     GROUP BY [DateTime] 
    ) u ON u.[DateTime] = t.[DateTime] AND u.[USER] = t.[USER] 
ORDER BY VALUE DESC 
0
;with cte 
as 
(
select 
*, 
row_number() over (partition by date order by replace(user,'user','') desc) as rownum 
from 
#temp 
) 
select * from cte where rownum=1 
2

這將始終從'User2'輸入優先,即使有來自'User1''User3'輸入。

;with cte as (
    select * 
    , rn = row_number() over (
     partition by [DateTime] 
     order by (case when [user] = 'User2' then 0 else 1 end) asc 
    ) 
    from t 
) 
select * 
from cte 
where rn=1 

rextester http://rextester.com/AZVA85684

結果:

+----------+-------+-------+----+ 
| DateTime | value | user | rn | 
+----------+-------+-------+----+ 
| 1/1/17 | 90 | User2 | 1 | 
| 2/1/17 | 80 | User2 | 1 | 
| 3/1/17 | 10 | User1 | 1 | 
+----------+-------+-------+----+