簡體   English   中英

如何查詢非連續值?

[英]How to query for non-consecutive values?

我有一列id1, 3, 4, 9, 10, 11在表中稱為t_mark

如何獲得非連續范圍? (例如[1, 3][4, 9]

或者,使用LEAD分析功能以及您喜歡的格式。 TEST CTE是您已經擁有的; 從第9行開始就是您所需要的。

SQL> with test (col) as
  2    (select 1  from dual union all
  3     select 3  from dual union all
  4     select 4  from dual union all
  5     select 9  from dual union all
  6     select 10 from dual union all
  7     select 11 from dual
  8    ),
  9  temp as
 10    (select col,
 11            lead(col) over (order by col) lcol
 12     from test
 13    )
 14  select '[' || col ||' - '|| lcol ||']' result
 15  From temp
 16  where lcol - col > 1
 17  order by col;

RESULT
-------------------------------------------------------
[1 - 3]
[4 - 9]

SQL>

[編輯:調整后,您不必考慮太多]

這是您所擁有的:

SQL> select * From t_mark;

      M_ID
----------
         1
         3
         4
         9
        10
        11

6 rows selected.

這是您需要的:

SQL> with temp as
  2    (select m_id,
  3            lead(m_id) over (order by m_id) lm_id
  4     from t_mark
  5    )
  6  select '[' || m_id ||' - '|| lm_id ||']' result
  7  From temp
  8  where lm_id - m_id > 1
  9  order by m_id;

RESULT
------------------------------------------------------------------
[1 - 3]
[4 - 9]

SQL>

基本上,您應該學習如何使用CTE(公用表表達式,又稱為with factoring子句 )。

假設“列表”是指帶有一列的表,那么可以使用lag()做到這一點:

select prev_number, number
from (select t.*, lag(number) over (order by number) as prev_number
      from t
     ) t
where prev_number <> number - 1;

這應該可以解決問題:

WITH original_table(number_column) as (select 1  from dual union all
                                       select 3  from dual union all
                                       select 4  from dual union all
                                       select 9  from dual union all
                                       select 10 from dual union all
                                       select 11 from dual),
numbers AS (
    SELECT row_number() over (ORDER BY number_column ASC ) row_num,
           number_column
    FROM original_table
)

SELECT nb1.number_column AS lnumber,
       nb2.number_column AS rnumber

FROM numbers nb1

  INNER JOIN numbers nb2 ON nb1.row_num + 1 = nb2.row_num 
                        AND nb1.number_column + 1 < nb2.number_column

結果:

| LNUMBER | RNUMBER |
|---------|---------|
| 1       | 3       |
| 4       | 9       |

鏈接到dbfiddle進行測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM