【问题标题】:SQL Server query with group as a count以组为计数的 SQL Server 查询
【发布时间】:2015-02-19 16:24:58
【问题描述】:

我不知道从哪里开始。我正在开发一个论坛,需要一个热门话题列表。它的工作方式是我需要一个主题列表,并按自某个日期时间以来回复该主题的消息数量排序。但只有唯一的消息(所以如果一个用户回复一个主题 100 次,而另一个主题有 2 个由 2 个不同的用户 ID 回复,那么第二个更高)

我猜它需要检索主题,然后对链接到该主题 id 的消息进行计数,这些消息按消息的用户 ID 分组(因此,如果用户对某个主题回复 100 次,它只计为 1),然后排序按此计数的主题。

这是我猜需要的表格

@lastvisit 将包含DateTime,因此它的所有主题消息都在此日期时间之后。所以我现在可以称之为日期时间 - 2 小时将是过去 2 小时的热门话题

Topics

TopicId
TopicTitle
Active (has to be active = True)

Messages

TopicId
MessageCreationDate
UserId
Active (has to be active = 1)

不知道从哪里开始,我需要学习的是 SQL

根据 lc 的回答,我想出了这个作为基础

SELECT
    T.TopicTitle, T.TopicId, UniqueUserCount
FROM 
    Topics AS T
OUTER APPLY
    (SELECT
         COUNT(distinct M.UserId) as UniqueUserCount, M.TopicId
     FROM 
         Messages AS M
     WHERE 
         M.TopicId = T.TopicId
     GROUP BY M.TopicId) AS m
GROUP BY 
    T.TopicId, TopicTitle, UniqueUserCount
ORDER BY 
    UniqueUserCount DESC

【问题讨论】:

  • 因此您要计算每个评论的排序权重,然后根据该权重对数据进行排序。这是纯粹的业务逻辑,最好在代码端做。

标签: sql-server


【解决方案1】:

您正在寻找COUNT DISTINCT。这将仅计算相关列的不同(唯一)值。因此,您将按主题分组并计算不同的用户。

在您的示例中,此查询:

select count(distinct UserId) as UniqueUserCount, TopicId
from Messages
group by TopicId

主题 13 有来自单个用户的 100 条消息,主题 42 有来自 2 个用户的每条消息,将返回如下结果:

唯一用户数 |主题 ID 1 | 13 2 | 42

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多