当前位置: 首页 > 面试题库 >

Oracle / Sybase SQL-根据先前的记录(不是简单的LAG)获取价值

红富
2023-03-14
问题内容

我的数据组织如下:

Invoice_Id  Invoice_Line  Kit_Flag  Part_Number
----------  ------------  --------  -----------
AB12345               1    K        KT-1234A
AB12345               2    C        1234567
AB12345               3    C        1234568
AB12345               4    C        1234569
AB12345               5    C        1234560
AB12345               6    K        KT-1234C
AB12345               7    C        1234561
AB12345               8    C        1234562
AB12345               9    K        KT-1234Q
AB12345              10    C        5678901
AB12345              11    C        1234561
AB12345              12    C        1234562

我试图从单个Invoice_Id(K =父级,C
=子级)中,从Kit_Flag为’K’的最后一行获取后续行的Part_Number值。为了简单起见,我在这里只列出了一个发票ID。

因此,对于以上数据,结果将如下所示:

Invoice_Id  Invoice_Line  Kit_Flag  Part_Number Parent_Part
----------  ------------  --------  ----------- ------------
AB12345               1    K        KT-1234A    KT-1234A
AB12345               2    C        1234567     KT-1234A
AB12345               3    C        1234568     KT-1234A
AB12345               4    C        1234569     KT-1234A
AB12345               5    C        1234560     KT-1234A
AB12345               6    K        KT-1234C    KT-1234C
AB12345               7    C        1234561     KT-1234C
AB12345               8    C        1234562     KT-1234C
AB12345               9    K        KT-1234Q    KT-1234Q
AB12345              10    C        5678901     KT-1234Q
AB12345              11    C        1234561     KT-1234Q
AB12345              12    C        1234562     KT-1234Q

在Excel中,可以通过“ = If(C2 =“
K”,C3,D2)”之类的方法来实现,而这实际上是我们暂时必须解决的问题,但是我正在尝试实现这一点的自动化。

该表位于Oracle 9i和Sybase上,但是Sybase实例不具有分析功能。

我认为这行不通(而且行不通),但从概念上讲,它表明了我正在尝试做的事情:

select
  t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number,
  case
    when Kit_Flag = 'K' then Part_Number
    else lag(Parent_Part, 1) over (partition by Invoice_Id order by Invoice_Line)
  end as Parent_Part
from Invoice_Data t

欢迎任何建议和/或指导。


问题答案:

一种方法是使用嵌套排名功能。首先,为所有获得一个值的常量分配一个常量值(使用max() over),然后将其用作分区。

select t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number,
       max(KitPart) over (partition by invoice_id, KitNum) as Parent_Part
from (select t.*,
             sum(isKit) over (partition by InvoiceId order by InvoiceLine) as KitNum
      from (select t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number,
                   (case when Kit_Flag = 'K' then 1 else 0 end) as IsKit,
                   (case when Kit_Flag = 'K' then Part_Number end) as KitPart
            from Invoice_Data t
           ) t
     ) t


 类似资料:
  • 我在 df 中有三列 我想在col1=x时执行以下操作,存储col2和col3的值,并在col1=y预期输出时将这些列值分配给下一行 任何帮助将不胜感激 注意:-火花 1.6

  • 问题内容: 如何根据生效日期获取当前记录?我应该使用子查询吗?除了MAX,我还有什么可以使用的吗? 我有这些表示例。 我的目标是获取 当前 属于用户放入的OrganizationUnit的所有ResourceID 。例如,如果用户将 SMESM1HTOVEOVE 放入OrganizationID参数中,则它将拉出当前位于 SMESM1HTOVEOVE 下的所有 ReourceID 。到目前为止,我

  • 问题内容: 首先,这个问题的标题太可怕了,但是我没有找到更好的方式来描述我的问题。 可能有一种非常简单的方法来执行此操作,但我无法弄清楚。这与这个问题非常相似,但是我在sqlite3(iOS)上运行,因此我怀疑我的选择受到更多限制。 我有一张带有产品记录的表格。所有记录都有一个ID(请注意:我不是在说行ID,而是每个产品唯一的标识号)。某些产品在表中可能有两个条目(两者都具有相同的ID)。唯一的区

  • 问题内容: 假设我有一些SKU的购买和销售数据: 假设按购买顺序出售,我如何通过SQL查找销售利润率?例如,sku 123的保证金是 其中有2件以17.50购买,还有1件以15.00购买尚未售出。 问题答案: 好问题。我采用的方法是计算总销售额。然后计算累计购买量,并将其与特殊逻辑结合起来以得出正确的结合算术: 注意:我尚未测试此查询,因此它可能存在语法错误。

  • 问题内容: 数据库-表 我运行了以下查询 搜索从2007年9月19日到2007年9月26日的记录,即8条记录。 这导致只显示2007年9月19日至2007年9月22日的记录,即仅5条记录 如何生成搜索查询,以便我可以获取所有8条记录-即这些日期的记录 预期产量 试过了 暂无记录 问题答案: 该日期可能具有时间成分。这是Oracle数据类型的一部分-但查询时通常不会显示。 更好的方法使用以下逻辑:

  • 问题内容: 我有这样的MySQL表 区域表 … 和学校表 我的注册表中有多个选择(下拉)菜单。区域下拉列表如下所示 我想做的是,获取“区域” ID,然后基于“学校”表中的ID(先前选择的ID)填充学校下拉菜单。我是JS的新手。请帮助我修复它。提前谢谢。 问题答案: