【问题标题】: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个月

标签: sql database oracle date window-functions


【解决方案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:是的,请参阅我回答中的最后一个查询。
猜你喜欢
  • 2023-02-14
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多