它们是一个 SQL 函数,可以使用下面的查询给我一个负值和正值吗?

Posted

技术标签:

【中文标题】它们是一个 SQL 函数,可以使用下面的查询给我一个负值和正值吗?【英文标题】:Is their an SQL function that can give me both a negative & positive value using the query below? 【发布时间】:2020-11-14 14:08:10 【问题描述】:

我试图做的实际上是通过计算当月的所有新用户减去上个月的新用户来显示一个值,然后将增量除以上个月的数字,然后再除以 100。这将获得百分比增长,但永远不会显示一个负数,我意识到使用 abs() 将负数转换为正数,它们是允许我这样做的函数吗?

谢谢。

select round(abs
((select count(id) from users where 
month(created_at) = month(current_date())
and
YEAR(created_at) = year(current_date()))
-
(select count(id) from users where 
month(created_at) = month(current_date - interval 1 MONTH)
and
YEAR(created_at) = year(current_date - interval 1 MONTH)))
/
(select count(id) from users where 
month(created_at) = month(current_date())
and
YEAR(created_at) = year(current_date()))
*100, 0)
as abs_diff
from users
limit 1
;

【问题讨论】:

请提供样本数据和期望的结果。 【参考方案1】:

您可以通过以下方式获取当月的新用户数:

count(case when last_day(created_at) = last_day(current_date) then 1 end)

以及上个月的新用户数:

count(case when last_day(created_at) = last_day(current_date - interval 1 month) then 1 end)

所以在乘以 100 之前将这些数字除以 1:

select
  100 * (
    count(case when last_day(created_at) = last_day(current_date) then 1 end) / 
    nullif(count(case when last_day(created_at) = last_day(current_date - interval 1 month) then 1 end), 0) 
    - 1
  ) abs_diff
from users
where date(created_at) > last_day(current_date - interval 2 month)

函数nullif()将返回null,以防上月新增用户数为0,避免被0除。

查看简化的demo。

【讨论】:

【参考方案2】:

我在想这样的事情:

select ym.*,
       (this_month - last_month) * 100.0 / last_month
from (select year(created_at) as yyyy, month(created_at) as mm, count(*) as this_month,
             lag(count(*)) over (order by min(created_at)) as prev_month
      from users
      group by yyyy, mm
     ) ym;

窗口函数是进行逐月比较的更简单的方法。

如果您只想要当月的这个,您可以添加:

order by yyyy desc, mm desc
limit 1

【讨论】:

以上是关于它们是一个 SQL 函数,可以使用下面的查询给我一个负值和正值吗?的主要内容,如果未能解决你的问题,请参考以下文章

查询结果错误

兄弟们啊,给我一份vb连接sql数据库实现的增删改查程序呗。别的数据库的也可以 但是要vb的,谢啦

Prometheus 查询语言

加快Sql查询

用PredicateBuilder实现Linq动态拼接查询

也给我一套EXCEL会计全套账吧