【问题标题】:Select distinct values ignoring one field选择不同的值忽略一个字段
【发布时间】:2012-10-16 15:52:13
【问题描述】:

我有一张类似的桌子

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

有什么建议可以解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:
    ;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
    

    【讨论】:

    • 这似乎是 SQL Server 实现这一目标的古怪方式,是的。
    【解决方案2】:

    您可能需要一个子选择而不是为此需要一个独特的。

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

    【讨论】:

    • 这将导致只选择一条记录
    • 我认为它会给每个 UsedId 一个记录,在这个例子中只有一个 UserID,所以在这个例子中结果是一个记录。不是这个问题吗?你在更大的桌子上试过吗?
    【解决方案3】:

    除了使用DISTINCT,您可以使用MAX() 并按其余列分组

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

    这应该会给你你正在寻找的结果。

    【讨论】:

    • 您的查询没有给出 huMpty duMpty 之后的结果。使用Id 字段进行分组将返回所有行。 SQLFiddle:sqlfiddle.com/#!3/cb4d1/1
    • 对不起,我忽略了这一点,应该从 select 和 group by 中删除 Id 列。
    • 那么你不会返回OP要求的结果,他想要结果中的Id字段,例如:3,100,5, 2012-10-18 17:10:05
    猜你喜欢
    • 2023-02-26
    • 1970-01-01
    • 2015-07-02
    • 2013-04-06
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 2021-08-06
    • 2011-12-24
    相关资源
    最近更新 更多