SQL查询 - 结合DISTINCT和TOP?

Lar*_*ard 8 sql sql-server join distinct

我有以下要查询的查询:

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

但是,当我开火时,我收到错误:

Msg 145, Level 15, State 1, Line 1
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
Run Code Online (Sandbox Code Playgroud)

我试图更改查询,所以它使用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.
Run Code Online (Sandbox Code Playgroud)

我想要什么:

把它想象成一个论坛.有帖子(dbForumPosts)和条目(dbForumEntry).pr post有0个条目.

我想要的是获取最近活动的帖子(包含最新更新条目的帖子).

And*_*mar 6

你可以找到最近的DatemadePostIdrow_number.然后你可以搜索最近的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
Run Code Online (Sandbox Code Playgroud)

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

select  top 5 PostId
from    (
        select  PostId
        ,       max(Datemade) as LastDate
        from    dbForumEntry
        group by
                PostId
        ) SubQueryAlias
order by
        LastDate desc
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)