甲骨文:计算最近 12 个月创建的实体

Oracle : Count entity created last 12 month

我正在寻找一种方法来获取过去 12 个月创建的实体数量。我尝试了一些方法,但有 2 个问题:

我的sql:

SELECT COUNT(*) 
FROM users 
WHERE extract(year FROM signin_date) = ? 
GROUP BY extract(month FROM signin_date)

在 sql 中有什么方法可以得到类似的东西吗?

| COUNT |
| 0     |      (january 2014)
| 3     |      (february 2014)
| 0     |      (march 2014)
...

我还发现:SQL select multiple counts in the last 12 months including missing months 但我真的不明白如何调整它来解决我的问题。

我假设您想在 table 中没有行的月份中包含一个零计数。为此,您首先需要创建一个可能的月份列表,然后使用外部联接。

with month_numbers as (
  select level as month
  from dual
  connect by level <= 12
), this_year_users as (
  select id, extract(month FROM u.signin_date) as signin_month
  from users
  where extract(year FROM signin_date) = ? 
)
select mn.month, count(u.id) 
from month_numbers mn
  left join this_year_users u on u.signin_month = mn.month
group by mn.month;

第一个常见的 table 表达式是一种生成连续数字列表的技巧,您可以稍后加入该列表。

第二个常见的 table 表达式只是 select 本月的所有用户。最后的 select 然后在 "all months" 和过滤后的用户 table 之间进行外部连接,计算每个月的用户数。该查询假设在 users table 中有一个名为 id 的不可空列(例如主键)。


如果您想要 "last 12 months",您需要一个不同的可能 "dates" 列表,它不仅包括月数,还包括年份以处理可追溯到上一年的时间间隔:

with month_numbers as (
  select to_char(add_months(trunc(current_date), -level), 'yyyy-mm') as month
  from dual
  connect by level <= 12
)
select mn.month, count(u.signin_date) 
from month_numbers mn
  left join users u on to_char(u.signin_date, 'yyyy-mm') = mn.month
group by mn.month
order by mn.month;

这不会包括 "current month",如果您需要,只需在 month_numbers CTE 中将 -level 替换为 -(level - 1)

SQLFiddle 示例:http://sqlfiddle.com/#!4/e02ac/2

试试这个代码。

SELECT COUNT(*) 
FROM users 
WHERE signin_date > add_months(CURRENT_DATE, -12)
GROUP BY extract(month FROM signin_date)