【问题标题】:Selecting all rows until first occurrence of given value选择所有行直到第一次出现给定值
【发布时间】:2010-10-18 13:15:01
【问题描述】:

对于以下数据:

日期|值|检查
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1
2006 | 5 | 0
2005 | 5 | 0
2004 | 5 | 1
2003 | 5 | 1
2002 | 5 | 1

我需要选择从 2009 年开始的所有行,直到检查列中第一次出现 0:

日期|值|检查
2009 | 5 | 1
2008 | 5 | 1
2007 | 5 | 1

我尝试了延迟功能,但我只能在一个月前检查。

我正在开发 Oracle 10g。

更新:

一切似乎都运行良好,我的测试数据集太小,无法说明性能差异。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    SELECT * FROM mytable where date > (
       SELECT max(date) FROM mytable where check = 0    
    ) 
    

    【讨论】:

      【解决方案2】:
      SELECT  *
      FROM    (
              SELECT  m.*,
                      MIN(CASE WHEN check = 0 THEN 0 ELSE 1 END) OVER (ORDER BY date DESC)) AS mn
              FROM    mytable
              )
      WHERE   mn = 1
      

      甚至更好:

      SELECT  *
      FROM    (
              SELECT  m.*, ROW_NUMBER() OVER (ORDER BY mydate DESC) AS rn
              FROM    mytable m
              ORDER BY
                      mydate DESC
              )
      WHERE   rownum = DECODE(check, 0, NULL, rn)
      ORDER BY
              mydate DESC
      

      后一个查询实际上会在遇到检查的第一个零时立即停止扫描。

      【讨论】:

      • 如果内部 ORDER BY 被索引满足,这只会“停止扫描”,在这种情况下,您不妨使用第一个版本。否则,Oracle 将对内部结果集进行完整排序。
      • 肯定会的。但是这个解决方案只需要一个 (date) 上的索引来高效工作,而 MAX() 解决方案还需要一个 (check, date) 上的索引。
      【解决方案3】:
      DECLARE @mytable TABLE (date integer, [value] integer, [check] integer)  
      
      INSERT INTO @mytable VALUES (2009, 5, 1)  
      INSERT INTO @mytable VALUES (2008, 5, 1)  
      INSERT INTO @mytable VALUES (2007, 5, 1)  
      INSERT INTO @mytable VALUES (2006, 5, 0)  
      INSERT INTO @mytable VALUES (2005, 5, 0)  
      INSERT INTO @mytable VALUES (2004, 5, 1)  
      INSERT INTO @mytable VALUES (2003, 5, 1)  
      INSERT INTO @mytable VALUES (2002, 5, 1)  
      
      SELECT *  
      FROM @mytable  
      WHERE date > (SELECT MAX(date) FROM @mytable WHERE [Check] = 0)
      

      【讨论】:

      • 不确定 'DECLARE @mytable TABLE' 是否可以在 Oracle 中工作 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多