【问题标题】:Compare nth row with n+1 th row and if it lies in range of n th row print n+1th row USNG ORACLE QUERY only [duplicate]将第 n 行与第 n+1 行进行比较,如果它位于第 n 行范围内,则仅打印第 n+1 行 USNG ORACLE QUERY [重复]
【发布时间】:2014-02-28 00:44:44
【问题描述】:

我有一张这样的桌子

    Id     name     stock_stat_no     stock_end_no
----------------------------------------------------
    1       a            2                  123
    2       b            3                  65
    3       c            191                199
    4       d            201                225
    5       e            220                223
    6       f            221                224

我试过了

 SELECT  *   FROM IV_STOCK_DETAILS a
  where  a.STOCK_START_NO in
     (select b.stock_end_no
        from IV_STOCK_DETAILS B
       where b.stock_start_no 
       between a.stock_start_no AND
             A.STOCK_END_NO 
         AND B.STOCK_END_NO BETWEEN a.stock_start_no AND A.STOCK_END_NO  
         AND (a.stock_start_no - A.STOCK_END_NO) !=0  
         )
  ORDER BY cod_stock_branch, stock_start_no;

所以我需要将所有行与之前的行逐一检查,如果它现在开始并且结束没有位于前一个打印行的开始和结束范围内。在这种情况下,答案将是 第 2,5,6 行..

我只需要查询

【问题讨论】:

  • 你刚刚问了这个问题! stackoverflow.com/questions/21545223/…
  • 为什么是 2,5,6?只有 2 和 5 符合这些条件。
  • -1 仅在 30 分钟后重新发布完全相同的问题
  • 两个人回答了您的另一个问题。您对他们俩都说“不工作”,但没有提供更多细节。其中一个甚至提供了一个 SQL Fiddle 来证明他们的解决方案有效。您没有与这些人互动,而是重新发布了您的问题,另外两个人浪费了时间提供了类似的答案。表现不佳。

标签: sql oracle


【解决方案1】:

可能是这样的:

SELECT b.id 
FROM   iv_stock_details a, 
       iv_stock_details b 
WHERE  a.id + 1 = b.id 
       AND b.stock_stat_no >= a.stock_stat_no 
       AND b.stock_stat_no < a.stock_end_no 
       AND b.stock_end_no <= a.stock_end_no 
       AND b.stock_end_no > a.stock_stat_no; 

SQLFiddle:http://sqlfiddle.com/#!2/94722/7

【讨论】:

    【解决方案2】:

    您可以尝试使用分析函数 领先/滞后

    恕我直言,确切的问题尚不清楚:什么是“范围”,什么是“行位于范围内”(字段可以在范围中)。

    让我们重新陈述问题;而不是“将第 n 行与第 n+1 行进行比较,如果它位于第 n 行的范围内,则打印第 n+1

    我将使用(可能的)等价物:“*如果先前的行范围 [stock_stat_no..stock_end_no] 与当前行的范围 [stock_stat_no..stock_end_no] 相交(按名称排序的行)*,则选择行”

    select id
      from (select id as id,
                   name as name,
                   stock_stat_no as stock_stat_no,
                   stock_end_no as stock_end_no,  
                   Lag(stock_stat_no) over(order by name) as prior_stock_stat_no,
                   Lag(stock_end_no) over(order by name) as prior_stock_end_no  
              from IV_STOCK_DETAILS)
     where (prior_stock_stat_no >= stock_stat_no) and 
           (prior_stock_stat_no <= stock_end_no) or
           (stock_stat_no >= prior_stock_stat_no) and 
           (stock_stat_no <= prior_stock_end_no)  
    

    【讨论】:

    • 我在 SQLFiddle 中尝试过这个查询...似乎没有产生任何结果:sqlfiddle.com/#!4/94722/2
    • @maythesource.com:我很抱歉这个错误,但问题表述不清楚:寻找的是交叉点,而不是“位于范围内”。我已经编辑了帖子,现在“2、5、6”就是答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2019-01-08
    • 2011-03-30
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多