【问题标题】:How to find the next value in this case在这种情况下如何找到下一个值
【发布时间】:2020-04-20 08:20:39
【问题描述】:

所以有点复杂。

我们在 ERP 系统中有一份“报告”。这就像来自几个表的大查询......但是,我猜它并不那么重要。我们有一千行。

这只是一个例子:

如何搜索“下一个传单号码”?因此,如果项目在传单 2015C 和 2016C 中,我想获得“扩展传单”。

这里的逻辑是:如果该项目在实际传单中 +1 = 那是一个“扩展传单”。

2015C: 20 实际年份,15 是传单编号。 C 是传单的类型。

日期是从 2008 年到今天。所以我不能只计算价值(有很多项目有很多传单)。

也许是LAG/LEAD

现在我正在使用这个查询,但它不准确(自联接):

decode(null,
  (select count(*) 
   from --my_actual_table g
   where g.id = id 
   and g.place_of_delivery = place_of_delivery 
   and g.partner = partner
   and g.date <= date and g.date >= date-22 
   group by g.id, g.place_of_delivery, g.partner 
   having count(*) > 1 ),
null,'Extended flyer')

有没有更好的方法来做到这一点?

【问题讨论】:

  • 代替图片,提供实际数据作为示例数据的创建和插入语句。并清楚地显示所需的输出。
  • 2015C:历史教训告诉我们智能钥匙是愚蠢的。
  • @APC 太真实了
  • @APC 我不确定,但我认为2015C 不是主键(在我们的系统中不是)。这就像一个车牌号码。传单以 XML 格式从另一个系统导出。我们的密钥看起来像这样036200002049(另一列,此处未列出)。我只是想知道,sbstr(flyer,3,2)lag/lead 是否不可能提取 +1 -> 16。傻,但我没有别的想法。
  • @Know-nothing 。 . .您表中的某些内容是否代表“项目”?我也对“下一个传单号码”的意思有点迷茫?那是通过某种递增吗?还是基于时间?还是基于别的东西?

标签: sql oracle oracle11g aggregate erp


【解决方案1】:

我创建了一些表格,其中仅包含一列:传单。 查询看起来像:

Select flyer,
case when to_number(substr(flyer,3,2))-to_number(substr(previous_flyer,3,2))=1 then 'Extended' else ' ' end
from
(
 Select flyer, 
 LAG(flyer,1) over (order by flyer) as previous_flyer
 from stackoverflow_table
)

检查了它及其工作,我得到了一个输出:

2015C    
2017C    
2018C   Extended
2019C   Extended
2021C    
2023C    
2024C   Extended
2025C   Extended
2027C    
2029C    
2030C   Extended

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多