选择忽略一个字段的不同值

时间:2012-10-16 15:52:14

标签: c# .net sql sql-server sql-server-2008

我有一张类似于此的表

Table(Id int, PropertyId int, UserId int, AccesedOn datetime)

因此,该表可以为一个用户的一个属性赋值,但不同的时间。

Eg.
1,100,5, 2012-10-16 16:24:48
2,100,5, 2012-10-17 11:22:00
3,100,5, 2012-10-18 17:10:05

我在这里尝试的是为特定用户选择不同的属性,但按最近的访问时间排序。

此外,我将此表连接到其他三个表,这些表导致提供重复值。因此,我必须使用DISTINCT命令。

我遇到问题是因为我在执行orderby AccesedOn时,它需要出现在select语句中,因为 AccesedOn 列不会带来不同的值有不同的价值观。

对于上面的示例,它应该只返回3,100,5, 2012-10-18 17:10:05

有任何建议要克服这个问题吗?

3 个答案:

答案 0 :(得分:3)

;WITH CTE as(
select *,ROW_NUMBER() over (partition by PropertyId,UserId  order by AccesedOn desc) as rn
from table1)

select * from CTE where rn=1

答案 1 :(得分:1)

你需要一个副选择,而不是你需要一个不同的选择。

select * 
from Table A
where AccessedOn in
  (Select max(AccessedOn) from table B where A.UserId = B.UserId)

答案 2 :(得分:1)

您可以使用DISTINCT而不是使用MAX(),而是按其余列分组

Select Id, PropertyId, UserId, MAX(AccesedOn)
From Table t
group by Id, PropertyId, UserId

这应该可以为您提供所需的结果。