SQL Server查询以组作为计数

时间:2015-02-19 07:27:30

标签: sql-server

我不知道从哪里开始。我正在开发一个论坛,需要一系列热门话题。这种方式的工作方式是我需要一个主题列表,并按特定日期时间内回复该主题的消息数量排序。但只有唯一的消息(因此,如果用户回复主题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

1 个答案:

答案 0 :(得分:2)

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

在您的示例中,此查询:

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

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

UniqueUserCount  | TopicId
              1  |      13
              2  |      42