我有一个包含日期时间,值和用户的表。 此表具有相同日期时间但具有不同用户和值的多行。
我希望选择不同的日期时间以及相应的值和用户。 如果有不同用户的重复日期时间,则应优先考虑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 :(得分: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