【问题标题】:sql window functions based on start flag and end flag of a row基于行的开始标志和结束标志的sql窗口函数
【发布时间】:2017-01-18 01:15:39
【问题描述】:

我的表格中有数据,目前有如下数据。 我想要使​​用窗口函数根据child_startchild end 列对行进行编号。

数据样本

LoadNumber |DispatchNumber|ChildLoadStart|ChildLoadEnd  |
---------------------------------------------------------
123        | A            |1             |1             |
---------------------------------------------------------
123        |B             |1             |0             |
---------------------------------------------------------
123        |C             |0             |0             |
---------------------------------------------------------
123        |D             |0             |1             |
---------------------------------------------------------

在上述负载 123 的数据中,我有两个子负载,即调度 A 是一个子负载,调度 B、C、D 形成另一个子负载。 所以我需要给每个孩子的负载编号,如下所示; 结果应该如下所示。有人可以帮我解决这个问题吗?

LoadNumber |DispatchNumber|ChildLoadStart|ChildLoadEnd  |Order         |
-----------------------------------------------------------------------
123        | A            |1             |1             |1             |
------------------------------------------------------------------------
123        |B             |1             |0             |1             |
------------------------------------------------------------------------
123        |C             |0             |0             |2             |
------------------------------------------------------------------------
123        |D             |0             |1             |3             |
------------------------------------------------------------------------

【问题讨论】:

  • 请尽量以文本而不是图像的形式发布示例数据和预期结果。
  • 并解释分配这些数字的逻辑
  • 如果 B、C、D 是相同的“子负载”,那么为什么它们没有相同的标识符? (例如调度号)

标签: sql oracle teradata window-functions


【解决方案1】:

如果DispatchNumber可以用来排序数据:

ROW_NUMBER()
OVER (PARTITION BY LoadNumber
      ORDER BY DispatchNumber
      RESET WHEN ChildLoadStart = 1) 

【讨论】:

    【解决方案2】:

    @dnoeth 提出的reset when 子句可能正是这里所需要的。但我不熟悉 Teradata,所以下面是 Oracle 替代方案,也许这对某人有用。

    首先使用累积和将您的数据分组,然后使用partition by clause 中的这一列(grp)作为row_number()

    select loadnumber, dispatchnumber, childloadstart, childloadend, 
           row_number() over (partition by loadnumber, grp order by dispatchnumber) as "ORDER"
      from (
        select data.*,
               sum(childloadstart) over (partition by loadnumber order by dispatchnumber) grp
          from data )
    

    测试数据和输出:

    create table data (LoadNumber number(4), DispatchNumber varchar2(2), 
                       ChildLoadStart number(1), ChildLoadEnd number(1));
    
    insert into data values (123, 'A', 1, 1);
    insert into data values (123, 'B', 1, 0);
    insert into data values (123, 'C', 0, 0);
    insert into data values (123, 'D', 0, 1);
    
    LOADNUMBER DISPATCHNUMBER CHILDLOADSTART CHILDLOADEND      ORDER
    ---------- -------------- -------------- ------------ ----------
           123 A                           1            1          1
           123 B                           1            0          1
           123 C                           0            0          2
           123 D                           0            1          3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2021-12-15
      • 2023-03-31
      • 1970-01-01
      • 2020-09-19
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多