【问题标题】:SQL Count number of records that appear more than once a month and aggregate by monthSQL Count 每月出现多次并按月聚合的记录数
【发布时间】:2019-09-23 20:14:06
【问题描述】:

我正在查看大量记录,并想计算一个 ID 每月更新一次以上的次数。

SELECT COUNT(*) AS Frequency, MONTH(Date) AS MM, YEAR(Date) AS YYYY, Id 
FROM data
WHERE -- [some filtering] 
    AND Date <=  -- end date 
    AND Date >=  -- start date 
GROUP BY Date, Id
    HAVING COUNT(*) > 1 
ORDER BY MM DESC

现在发生的情况是,我只找到每天更新一次以上的 ID 数量。我想要做的是按月对 ID 进行分组。

我曾尝试在我的 GROUP BY 中使用列 MM,但随后我收到错误代码,指出这些列选择无效。

我尝试使用以下 GROUP BY:

GROUP BY DATEPART(MONTH, Date), Id

我得到的只是连续的 8120 错误,我不知道应该如何将它们组合在一起。任何帮助将不胜感激。

【问题讨论】:

  • 稍微绕道...但是在继续到处喷 NOLOCK 之前,您可能需要阅读一些内容。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
  • 另外,当收到错误消息时,提供错误消息而不是只提供数字会很有帮助,因为大多数人并没有记住所有的数字。
  • 请注意!

标签: sql-server group-by datepart


【解决方案1】:

首先让我们修复您的查询,以便它进行适当的聚合:

SELECT COUNT(*) AS Frequency, MONTH(Date) AS MM, YEAR(Date) AS YYYY, Id 
FROM data with(NOLOCK)
WHERE -- [some filtering] 
GROUP BY MONTH(Date), YEAR(Date), Id
HAVING COUNT(*) > 1 
ORDER BY YYYY, MM DESC

这会为您提供每月更新一次以上的Ids 列表。

现在,如果您想知道有多少Ids 每月更新了多次,您可以添加另一个聚合级别:

SELECT MM, YYY, COUNT(*)
FROM (
    SELECT COUNT(*) AS Frequency, MONTH(Date) AS MM, YEAR(Date) AS YYYY, Id 
    FROM data with(NOLOCK)
    WHERE -- [some filtering] 
    GROUP BY MONTH(Date), YEAR(Date), Id
    HAVING COUNT(*) > 1 
) x
ORDER BY YYYY, MM DESC

【讨论】:

  • 谢谢,我们更感兴趣的是哪些 ID 以及当月更新了多少次。
  • @Viss:好的;第一个查询回答了这个问题。
  • 感谢所有帮助!我不知道我是否只是筋疲力尽/累了。
  • 欢迎@Viss!有时每个人都需要一点帮助...如果我的回答正确回答了您的问题,请点击绿色复选标志accept it...谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 2019-01-30
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多