2017-02-14 135 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 | 
+----------+-------+-------+----+