SQL - 选择要选择的重复值
问题描述:
我有一个包含日期时间,值和用户的表。 该表格具有相同日期时间的多行,但具有不同的用户和值。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
我敢肯定有一个简单的答案,但我不能为我的生活工作怎么办它!
任何帮助非常感谢。
谢谢
答
不是很简单!利用窗口函数和公用表表达式
; 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子句中会有所不同。 –
答
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
答
;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
答
这将始终从'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 |
+----------+-------+-------+----+
ü怎么GT 80日期17年2月1日? –
对不起的打字错误,意味着90.将更新。 –