SQL - 选择要选择的重复值

时间:2017-02-14 10:45:01

标签: sql sql-server

我有一个包含日期时间,值和用户的表。 此表具有相同日期时间但具有不同用户和值的多行。

我希望选择不同的日期时间以及相应的值和用户。 如果有不同用户的重复日期时间,则应优先考虑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

我确信这有一个简单的答案,但我不能为我的生活做出如何做到这一点!

非常感谢任何帮助。

由于

4 个答案:

答案 0 :(得分: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

答案 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 |
+----------+-------+-------+----+

答案 2 :(得分: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

答案 3 :(得分: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