甲骨文:计算最近 12 个月创建的实体
Oracle : Count entity created last 12 month
我正在寻找一种方法来获取过去 12 个月创建的实体数量。我尝试了一些方法,但有 2 个问题:
- 我只有当年的12月
- 我的查询 returns 如果一个月内没有创建任何实体,则为 null。
我的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)
我正在寻找一种方法来获取过去 12 个月创建的实体数量。我尝试了一些方法,但有 2 个问题:
- 我只有当年的12月
- 我的查询 returns 如果一个月内没有创建任何实体,则为 null。
我的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)