获取data.stackexchange中每月的帖子数量

时间:2018-05-05 06:16:44

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

我试图获得每月的每月总帖数

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,但是错误在其他地方。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您需要使用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

答案 1 :(得分:1)

摆脱这些位:

SUM (q.Score)               AS TotalScore,

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

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

答案 2 :(得分:1)

我删除了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

看起来像你在问什么。