SQL 查询统计每月签到次数

Posted

技术标签:

【中文标题】SQL 查询统计每月签到次数【英文标题】:SQL query to count number of checkins per month 【发布时间】:2020-04-19 23:40:48 【问题描述】:

长话短说,我正在开发一个使用 PostgreSQL 管理 yelp 签入的数据库。 checkintable 具有属性 business_id(string)、date(string in form yyyy-mm-dd) 和 time(string in form 00:00:00)。

我需要做的是,给定一个business_id,我需要返回一个仅基于mm(月)值的签到总数列表。

因此,例如,我需要检索 1 月、2 月、3 月、4 月等月份的签到总数,而不是基于年份。

非常感谢任何帮助。我已经考虑过 group by 子句,但我不知道如何考虑 '%mm%'。

【问题讨论】:

“不是基于年份”是什么意思?您想在一个“月”的数据中混合多年的数据吗? @GordonLinoff 这就是我打算做的。 查看split_part 函数here 或将您的字符串转换为日期并使用here 中的extract 函数 【参考方案1】:

重申 Gordon,无论是否上课,将日期和时间存储为字符串会使事情变得更难、更慢,而且更容易出错。很难利用 Postgres 的 powerful date math functions。 单独存储日期和时间会使事情变得更加困难;您必须将它们连接在一起以获得完整的时间戳,这意味着它不会被索引。确定两个事件之间的时间变得不必要地困难。

它应该是一个 timestamp 列。希望您的班级很快就会介绍这一点。

我需要做的是,给定一个business_id,我需要返回一个仅基于mm(月)值的签到总数列表。

这看似简单。将您的字符串转换为日期,幸运的是它们采用 ISO 8601 格式,因此不需要重新格式化。然后使用extract 仅提取月份部分。

select
  extract('month' from checkin_date::date) as month,
  count(*)
from yelp_checkins
where business_id = ?
group by month
order by month

但有一个问题。如果在给定的月份内没有商家签到怎么办?那个月我们不会得到任何条目。这是一个很常见的问题。

如果我们希望每个月都有一行,我们需要使用generate_series 生成一个包含所需月份的表,然后与我们的签入表左连接。左连接可确保所有月份(“左”表)都存在,即使连接表(“右”表)中没有对应的月份。

select
  months.month,
  count(business_id)
from generate_series(1,12) as months(month)
left join yelp_checkins
  on months.month = extract('month' from checkin_date::date)
 and business_id = ?
group by months.month
order by months.month

现在我们有了一个月份表,我们可以按它进行分组。我们不能使用where business_id = ? 子句,否则它将在左连接发生后过滤掉空的几个月。相反,我们必须将其作为左连接的一部分。

Try it.

【讨论】:

dbfiddle.uk/… - 可以更高效和便携。【参考方案2】:

为什么要将日期存储为字符串?那是一个损坏的数据模型。你应该修复数据。

也就是说,我建议将日期转换为当月的第一天:

select date_trunc('day', datestr::date) as yyyymm, count(*)
from t
group by yyyymm
order by yyyymm;

如果您不希望这些基于年份,请使用extract()

select extract(month from datestr::date) as mm, count(*)
from t
group by mm
order by mm;

【讨论】:

我不会在现实世界中这样做。这是一个班级项目,我们必须遵循所需的数据库规范。 @SeanRoberts 。 . .当课程使用结构不佳的数据示例时,这很可悲。我担心学生会记住诸如“正确的方式”之类的例子。相反,给学生糟糕的数据并说:首先要做的是修复数据结构,以便您可以轻松回答需要回答的问题。 @SeanRoberts 抱歉,您收到了不好的建议。有时你可以纠正老师。

以上是关于SQL 查询统计每月签到次数的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以统计出现次数,但在特定值处停止

sql server 大数据, 统计分组查询,数据量比较大计算十分钟内每秒钟执行次数

sql统计连续相同数值的次数

近七天内用户登录次数sql语句怎么写?

显示今年每月的访问次数

sql中的条件判断循环统计