为啥这个投票/帖子比率总是1?

Posted

技术标签:

【中文标题】为啥这个投票/帖子比率总是1?【英文标题】:Why is this votes/posts ratio always 1?为什么这个投票/帖子比率总是1? 【发布时间】:2015-10-01 19:33:50 【问题描述】:

我正在与 SEDE 合作创建投票与帖子比率的图表。消除了所有实际错误后,我遇到了一个新问题:由于某种原因,该比率始终为 1。这是当前的 SQL:

SELECT CAST(p.CreationDate AS DATE) AS [CreationDate],
       COUNT(CAST(v.CreationDate AS DATE)) / COUNT(CAST(p.CreationDate AS DATE))
         AS [Ratio]
FROM Posts p
INNER JOIN Votes v ON v.PostId = p.Id
WHERE v.VoteTypeId = ##VoteType:int?2## AND
      p.PostTypeId = 1 OR p.PostTypeId = 2
GROUP BY CAST(p.CreationDate AS DATE)
ORDER BY Ratio

查询本身可以在here找到。

suggested in chat 这可能是因为加入表格会产生所有可能的组合,因此投票数和帖子数始终相同(因此 n/n = 1)。这是正确的,如果是,我应该怎么做?

【问题讨论】:

因为您的计数是按 p.CreationDate 分组的 @JoeTaras ...那么应该我应该分组吗? 您在 CreationDate 上进行分组,您的计数是 CreationDate 的计数 - 每个组只有一个唯一的 CreationDate,因为这是定义组的原因。如果您想为每个帖子投票,请使用您拥有的加入,在 p.Id 上分组,然后选择 count(v.VoteId)。如果您关心创建日期,请通过 p.Id 连接回 Post 表 p2 并选择 p2.CreationDate @EdPlunkett 但肯定是count(p.Id) ≡ 1 无论如何?这有什么帮助? @ArtOfCode 我是说,没有JOIN 或聚合,只需运行两个使用适当的WHERE 条件过滤的SELECT * 查询,这样您就可以看到两者之间的关系如何表解决了。如果这不能帮助您看到它,那么至少可以在您的问题中发布一组更好的示例数据以供其他人帮助。 【参考方案1】:

由于 in 内连接的两边都存在,COUNT(CAST(v.CreationDate AS DATE))COUNT(CAST(p.CreationDate AS DATE)) 将返回完全相同的数字,即组中的行数*

如果您想计算在给定日期每个新帖子获得的新票数,请使用COUNT(DISTINCT)

SELECT CAST(p.CreationDate AS DATE) AS [CreationDate],
       COUNT(DISTINCT v.Id) / COUNT(DISTINCT p.Id) AS [Ratio]
FROM Posts p
INNER JOIN Votes v ON v.PostId = p.Id
WHERE v.VoteTypeId = ##VoteType:int?2## AND
      p.PostTypeId = 1 OR p.PostTypeId = 2
GROUP BY CAST(p.CreationDate AS DATE)
ORDER BY Ratio

* 假设 CreationDate 不可为空。

【讨论】:

以上是关于为啥这个投票/帖子比率总是1?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不使用 NodeJS 中的 API 就无法获取所有 Instagram 帖子

在 CouchBase 上获取未经用户投票的帖子的最有效方法是啥?

Hasura:允许用户不为自己的帖子投票

编写 Eloquent Query 以查找得票最多的帖子 Laravel

为啥查询不返回存档帖子?

无法弄清楚“一旦10个用户喜欢它就批准帖子”的系统