如果值不可用,则获取上个月的值
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
最后:如果您确实将日期存储为字符串,那么这里有一个选项可以在继续之前将它们转换为 date
s:
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:是的,请参阅我回答中的最后一个查询。以上是关于如果值不可用,则获取上个月的值的主要内容,如果未能解决你的问题,请参考以下文章
axios 和 promise,数组值不可用但出现在 console.log