2012-10-16 21 views
0

我有类似这样选择不同的值忽略一个字段

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,它需要出现在其中,因为AccesedOn列有不同的值不会带来明显的价值select语句。

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

任何建议,以解决这个?

回答

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 
+0

这看起来像是SQL Server的实现方式,是的。 – Avish

1

这很可能是你需要一个子选择,而不是你需要一个独特的。

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

这将导致只选择一条记录 –

+0

我认为它会给每个UsedId一个记录,在这个例子中只有一个用户ID,所以在这个例子中结果是一条记录。这不是问题吗?你在大桌子上试过了吗? –

+0

刚刚测试过它,对我来说工作正常... –

1

而不是使用DISTINCT的,您可以通过列

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

这应该给你你正在寻找的结果,其余的使用MAX()和组。

+1

您的查询不会给huMpty duMpty后的结果。使用“Id”字段进行分组将返回所有行。 SQLFiddle在这里:http://sqlfiddle.com/#!3/cb4d1/1 – Tony

+0

对不起,我忽略了这一点,Id列应该从select和group中删除。 – MagedW

+0

然后你不会返回OP要求的结果,他想要结果中的'Id'字段,例如:'3,100,5,2012-10-18 17:10:05' – Tony

相关问题