【问题标题】:Get number of posts per month in data.stackexchange在 data.stackexchange 中获取每月的帖子数
【发布时间】:2018-05-05 06:16:44
【问题描述】:

我正在尝试获取每月的帖子总数

WITH QuestStatsByMonth  AS (
    SELECT  DATEADD (month, DATEDIFF (month, 0, q.CreationDate), 0) AS [Month],
    t.TagName,
    SUM (q.Score)               AS TotalScore,
    q.Id                        AS id

    FROM        Posts           q
    INNER JOIN  PostTags        pt
    ON          q.Id            = pt.PostId
    INNER JOIN  Tags            t
    ON          t.Id            = pt.TagId

    WHERE       q.PostTypeId    = 1
    AND         t.TagName       IN ('perl6')

    GROUP BY    DATEADD (month, DATEDIFF (month, 0, q.CreationDate), 0),
                t.TagName
)
SELECT
q.[Month], q.TagName + ' questions' AS [Tag], COUNT(q.id) AS Qs

FROM        QuestStatsByMonth   q
LEFT JOIN   QuestStatsByMonth   h
ON          h.[Month]           <= q.[Month]
AND         h.TagName           = q.TagName
GROUP BY    q.[Month], q.TagName
ORDER BY    q.[Month], q.TagName

但这会产生一个

选择列表中的“Posts.Id”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我尝试在 WITH 语句中设置 COUNT,但错误出现在其他地方。有什么想法吗?

【问题讨论】:

标签: sql sql-server tsql data.stackexchange.com


【解决方案1】:

摆脱这些位:

SUM (q.Score)               AS TotalScore,

GROUP BY    DATEADD (month, DATEDIFF (month, 0, q.CreationDate), 0),
            t.TagName

在您的 CTE 中,您只需过滤问题。如果分组是您在主查询中执行的操作,那么您实际上不应该分组。分组使得无法选择q.Id:您要求每个月/标签有一行,但每个月/标签中通常有多个问题ID。您可以直接删除 TotalScore 而无需替换它,因为无论如何您都不使用它。

【讨论】:

  • 这行得通,但是当标签总数在 600 左右时,数字不会相加It returns up to thousands of questions
  • @jjmerelo 这是您的LEFT JOIN 的结果,它有效地将结果转换为累积和。我现在看到它甚至不能正常工作。您可以将其取出(如 Bogdan 的回答),因为您不使用 h 中的任何内容。
【解决方案2】:

你需要用 agg 函数包裹q.id

WITH QuestStatsByMonth  AS (
    SELECT DATEADD (month, DATEDIFF (month, 0, q.CreationDate), 0) AS [Month],
    t.TagName,
    SUM (q.Score)               AS TotalScore,
    COUNT(q.Id)                 AS id

    FROM  Posts           q
    JOIN  PostTags        pt
      ON  q.Id            = pt.PostId
    JOIN  Tags            t
      ON  t.Id            = pt.TagId
    WHERE q.PostTypeId    = 1
      AND t.TagName       IN ('perl6')
    GROUP BY    DATEADD (month, DATEDIFF (month, 0, q.CreationDate), 0),
                t.TagName
)
SELECT
  q.[Month], q.TagName + ' questions' AS [Tag],
  SUM(q.id) AS Qs
FROM        QuestStatsByMonth   q
LEFT JOIN   QuestStatsByMonth   h
  ON          h.[Month]           <= q.[Month]
  AND         h.TagName           = q.TagName
GROUP BY    q.[Month], q.TagName
ORDER BY    q.[Month], q.TagName;

SEDE Demo

【讨论】:

    【解决方案3】:

    我删除了LEFT JOIN 部分。

    WITH QuestStatsByMonth  AS (
        SELECT DATEADD (month, DATEDIFF (month, 0, q.CreationDate), 0) AS [Month],
        t.TagName,
        SUM (q.Score)               AS TotalScore,
        COUNT(q.Id)                        AS id
    
        FROM  Posts           q
        JOIN  PostTags        pt
          ON  q.Id            = pt.PostId
        JOIN  Tags            t
          ON  t.Id            = pt.TagId
        WHERE q.PostTypeId    = 1
          AND t.TagName       IN ('perl6')
        GROUP BY    DATEADD (month, DATEDIFF (month, 0, q.CreationDate), 0),
                    t.TagName
    )
    SELECT
      q.[Month], q.TagName + ' questions' AS [Tag],
      COUNT(q.id) AS Qs
    FROM        QuestStatsByMonth   q
    GROUP BY    q.[Month], q.TagName
    ORDER BY    q.[Month], q.TagName
    

    看起来像你在问什么。

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多