【问题标题】:Compare nth row with n+1 th row and if it lies in range of n th row print n+1 row USNG ORACLE QUERY比较第 n 行和第 n+1 行,如果它在第 n 行范围内,则打印 n+1 行 USNG ORACLE QUERY
【发布时间】:2014-02-04 15:19:25
【问题描述】:

我有一张这样的桌子

ID     name   Start_no     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;

所以我需要逐一检查所有行及其前一行,以及它的start_noend_no 是否位于前一个打印行的start_noend_no 内。在这种情况下,答案将是第 2、5、6 行。我只需要查询。

【问题讨论】:

  • 顺便说一句,您可能想选择meaningful username。这样做的一个好处是其他人可以使用at-replies,您会收到一条通知,说明有人在评论中向您发送了电子邮件。
  • 正确的sample code(此处为 SQL 语句)比任何即席模式和示例数据格式都更有用。请使用CREATE TABLEINSERT ... VALUES 作为samples。所需的结果不需要以示例代码的形式呈现,因为结果是代码的输出,而不是代码本身。

标签: sql oracle


【解决方案1】:

这是一个使用LAG 函数或Oracle 的解决方案,可让您访问上一行。

而且,根据您的要求,您应该只从表中获取第 2 行和第 5 行,因为第 6 行的 end_no 为 224,不小于第 5 行的 end_no,即 223

SELECT id, name, start_no, end_no 
FROM (
    SELECT id, name, start_no, end_no, 
           lag(start_no, 1, 0) over (order by id) prev_start_no ,
           lag(end_no, 1, 0) over (order by id) prev_end_no
    FROM test
) 
WHERE start_no BETWEEN prev_start_no AND prev_end_no
AND end_no BETWEEN prev_start_no AND prev_end_no;

【讨论】:

  • 只要确保根据数据库中的表名和列名更改表名和列名,然后执行即可。
  • 它的工作,但我不知道它从哪里获取结果。答案不是这显示的,而是其他的。!!!可能我认为我没有正确地从我的导师那里得到问题!因为逻辑上你是对的,但实际答案不是这个!!!
  • 您期望的“实际答案”是什么?
【解决方案2】:

加入救援!在前一个 ID 上将表连接到自身,并在连接中包含范围测试。

SELECT iv.*
  FROM IV_STOCK_DETAILS AS iv
    JOIN IV_STOCK_DETAILS AS ivprev ON iv.id=ivprev.id+1
         AND ivprev.Start_no <= iv.Start_no
         AND iv.End_no <= ivprev.End_no

【讨论】:

  • “不工作”什么也没告诉我们。描述问题时,请说明您的预期和实际得到的结果,包括任何错误消息。
  • 我的意思是 iot 给了我错误 ORA-1722 无效号码。让我提醒你 id 只是在这里的整数,在实际表中它的字母数字。很抱歉给您带来不便。
  • @user3264817:这不是提醒,而是新信息。 Sample code应该是有代表性的,所以样本ID列应该和真实ID列的类型相同。请注意,关系模型中的行本质上不是有序的,因此没有“前一行”的内在概念。您必须在查询中定义它,就像我对 iv.id=ivprev.id+1 所做的那样。
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多