SQL 查询 - 结合 DISTINCT 和 TOP?

Posted

技术标签:

【中文标题】SQL 查询 - 结合 DISTINCT 和 TOP?【英文标题】:SQL Query - Combine DISTINCT and TOP? 【发布时间】:2012-10-24 13:11:16 【问题描述】:

我想触发以下查询:

SELECT DISTINCT TOP(5) fp.PostId FROM dbForumPosts fp
LEFT JOIN dbForumEntry fe ON fp.PostId = fe.PostId
Order by fe.Datemade DESC

但是,当我触发它时,我得到了错误:

Msg 145, Level 15, State 1, Line 1
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

我试图更改查询,所以它改用了 GROUP BY,但是我遇到了以下问题:

Msg 8127, Level 16, State 1, Line 4
Column "dbForumEntry.Datemade" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

我想要什么:

将其视为一个论坛。有帖子 (dbForumPosts) 和条目 (dbForumEntry)。 pr post 有 0 个条目。

我想要的是获取具有最新活动的帖子(具有最新更新条目的帖子)。

【问题讨论】:

每个PostId 可以有多个Datemade 吗?如果是这样,使用哪一个进行订购? 您到底想做什么?您是尝试获取前五个记录,然后从中获取不同的值,还是尝试获取不同的值,然后只获取前五个? 我添加了我想要的文本:-) 【参考方案1】:

您可以通过row_number 找到每个PostId 的最新Datemade。然后您可以搜索最近的 5 个帖子:

select  top 5 PostId
from    (
        select  PostId
        ,       Datemade
        ,       row_number() over (partition by PostId
                    order by Datemade) as rn
        from    dbForumEntry
        ) SubQueryAlias
where   rn = 1 -- Most recent row per PostId
order by
        Datemade desc

或者,您可以使用group by 子查询实现相同的目的:

select  top 5 PostId
from    (
        select  PostId
        ,       max(Datemade) as LastDate
        from    dbForumEntry
        group by
                PostId
        ) SubQueryAlias
order by
        LastDate desc

如果dbForumEntry 有一个ID 列(比如ForumEntryId),这样的查询可能会执行得更好。数据库可以在不为整个表编译 row_numbermax(Datemade) 的情况下运行它。

select  top 5 PostId
from    dbForumPosts fp
where   not exists -- No later entry for the same post exists
        (
        select  *
        from    dbForumPosts fp2
        where   fp2.PostId = fp.PostId
                and fp2.ForumEntryId > fp.ForumEntryId
        )
order by
        Datemade desc

【讨论】:

非常感谢 - 它真的很有帮助:-)!谢谢。

以上是关于SQL 查询 - 结合 DISTINCT 和 TOP?的主要内容,如果未能解决你的问题,请参考以下文章

如何将spring数据jpa规范查询中的distinct和sort与join结合起来

在 Apache Druid SQL 查询中结合 TIME_FLOOR 和 MILLIS_TO_TIMESTAMP 以获取纪元时间戳

SQL Server Temp Table to a Select Distinct Count Distinct quetsion [关闭]

SQL中distinct的用法和left join查询的含义

使用DISTINCT时,LINQ to SQL不生成ORDER BY?

利用linq to sql 建立查询方法返回值类型为List<T> 怎样去除集合中的重复数据?