Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-选择要选择的重复值_Sql_Sql Server - Fatal编程技术网

SQL-选择要选择的重复值

SQL-选择要选择的重复值,sql,sql-server,Sql,Sql Server,我有一个带有日期时间、值和用户的表。 此表在同一日期时间有多行,但用户和值不同 我希望选择具有相应值和用户的distinct datetime。 如果存在不同用户的重复日期时间,则应优先考虑user2输入的值 Table 1 ----------------- DateTime| Value| User --------|---------|--------- 1/1/17 | 10| User1 2/1/17 | 30| User1 3/1/

我有一个带有日期时间、值和用户的表。 此表在同一日期时间有多行,但用户和值不同

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

这将始终优先考虑来自“User2”的输入,即使有来自“User1”和“User3”的输入

雷克斯测试仪

结果:

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

17年2月1日的u gt 80是怎么回事?对不起,错别字,应该是90。将更新。这利用了“User2”大于“User1”这一事实,在更一般的设置中,orderby子句会有所不同。
;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
;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
+----------+-------+-------+----+
| DateTime | value | user  | rn |
+----------+-------+-------+----+
| 1/1/17   |    90 | User2 |  1 |
| 2/1/17   |    80 | User2 |  1 |
| 3/1/17   |    10 | User1 |  1 |
+----------+-------+-------+----+