如果值不可用,则获取上个月的值

Posted

技术标签:

【中文标题】如果值不可用,则获取上个月的值【英文标题】:If value is unavailable then get last month's value 【发布时间】:2020-05-17 00:06:03 【问题描述】:

当数据不可用或未注册时,我的表会生成每月数据,并且一列(位置)显示 0。

我在这里要做的是,如果该位置在本月返回 0,则查找前一个月的位置。

| MONTH    | ID     | LOCATION  |
| Jan 2020 | 1111   | 0         |
| Jan 2020 | 1242   | 23        |
| Jan 2020 | 1425   | 58        |

ID: 1111 应该显示Dec 2019 的位置,而不是Jan 2020

到这里为止,当我运行查询时,它没有显示任何结果:

SELECT c.MONTH, c.ID, CASE WHEN c.LOCATION = 0 then b.LOCATION else c.LOCATION END as LOCATION
FROM DB.TABLE1 c, DB.TABLE1 b
where c.ID = b.ID
and c.MONTH in ('Jan 2020')
and b.MONTH in ('Dec 2019')

有什么帮助吗? 谢谢

【问题讨论】:

如果有多个 2019 年 12 月的值怎么办?我们拿哪一个? 您是真的将日期存储为字符串,还是实际上有一列 date 数据类型? 从2015年到2020年4月有很多个月,我们取2020年1月前1个月 【参考方案1】:

您似乎正在寻找带有条件逻辑的lag()。此外,您应该将您的日期存储为 date 数据类型而不是字符串...所以这假设您这样做:

select
    month,
    id,
    case when location = 0 
        then lag(location) over(order by month) 
        else location
    end as location
from table1
order by month

如果0 值可能连续超过一个月,并且您想返回到非0 值的第一个可用月份,则可以使用hand 子句ignore nulls

select
    month,
    id,
    case when location = 0 
        then lag(nullif(location, 0) ignore nulls) over(order by month) 
        else location
    end as location
from table1
order by month

最后:如果您确实将日期存储为字符串,那么这里有一个选项可以在继续之前将它们转换为 dates:

select
    month,
    id,
    case when location = 0 
        then lag(nullif(location, 0) ignore nulls) over(order by to_date(month, 'mon yyyy')) 
        else location
    end as location
from table1
order by to_date(month, 'mon yyyy')

【讨论】:

不幸的是,我没有将数据类型更改为最新的权限。有没有办法解决字符串? @user2803287:是的,请参阅我回答中的最后一个查询。

以上是关于如果值不可用,则获取上个月的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 计算的可用磁盘空间与我的电脑中显示的值不匹配

axios 和 promise,数组值不可用但出现在 console.log

如果接收到的值不匹配,则解码字典正确

为啥在提交对象之前 SQLAlchemy 默认列值不可用?

“Windows [版本]:此值不可用”是啥意思。 MSDN 中的声明?

Key操作命令