sql-server - SQL 查询改进 - 使用 max 和 groupby 选择

标签 sql-server nhibernate select group-by max

问题


鉴于以下两个表格,我想为在给定时间范围内(例如 2010 年 2 月)发表最新(即最后)评论的帖子选择所有 ID。

查询结果应该只返回帖子 ID 1,因为帖子 ID 2 的最新评论超出了时间跨度过滤器的范围。

问题


我在下面创建了 SELECT 语句,它看起来是正确的,并且可以处理抛给它的所有测试用例。

但是,为了继续提高我的 SQL 技能,我正在询问社区是否有“更好”的方法可用于这种情况,关于改进现有语句的任何建议,和/或边缘情况不包括在内。

请注意,这是对实际表格的松散翻译,为了使问题更容易理解而进行了更改。对于它的值(value),我使用的是 SQL Server 2005。

表格


发布

Id    Text     Visible
1     Post 1   1
2     Post 2   1
3     Post 3   0
.     ...
n     Post n   1

评论

Id    Post_Id    Text                  CommentNumber    Timestamp
1     1          Comment 1, Post 1     1                2/3/2010
2     1          Comment 2, Post 1     2                2/4/2010
3     2          Comment 1, Post 2     1                3/1/2010
.     .          .
n     m          Comment n, Post m     x                xx/xx/xxxx

SQL命令


SELECT [Id],[Text]
FROM [Post]  
WHERE [Id] IN (  
    SELECT comment1.[Post_Id]  
    FROM (  
        SELECT max([CommentNumber]) as maxComment,  
            [Post_id]  
        FROM [Comment]  
        GROUP BY [Post_id]  
    ) as comment2  
    INNER JOIN [Comment] as comment1 on comment1.[Post_id] = comment2.[Post_id]  
    WHERE comment1.[Timestamp] BETWEEN '2/1/2010 00:00:00.000' AND '2/28/2010 23:59:59.999'  
    AND comment1.[CommentNumber] = comment2.maxComment  
)
AND [Post].[Visible] = 1

奖励问题


是否可以使用 NHiberate 创建此查询(使用 Criteria API 或 HQL)?

最佳答案

SELECT
    Post_Id
FROM
    Comment
GROUP BY
    Post_Id
HAVING
    MAX(Timestamp) >= '2/1/2010'

HAVING 视为发生在 GROUP BY 上的 WHERE,对 进行操作分组结果集。

虽然不了解 NHibernate。

关于sql-server - SQL 查询改进 - 使用 max 和 groupby 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2372917/

相关文章:

c# - Linq 到 NHibernate : 'System.Linq.EnumerableQuery` 1[Entity]' cannot be converted

c# - 使用 LINQ 插入/选择 - 绕过查询中的实体构造

MySQL,从两个表中选择时插入

MySQL:JOIN 查询获取所有具有可为空字段的项目

sql - 添加带有月份标识符的列可以提高查询性能吗?

sql-server - 日期之间的差异 - sql server

asp.net - 在旧的胖客户端数据库上放置一个新的 Web 界面

php - 连接到远程服务器 MySQL 问题

c# - Fluent NHibernate - 从映射覆盖表名

nhibernate - 如何使用多对多将 NHibernate 从表 A 映射到表 A 本身?