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_number
或 max(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查询的含义