2014-07-03 50 views
0

例如,我有一個表是這樣的:SQL排除記錄一起練級

+---------+-------+----------+ 
| sort_id | level | security | 
+---------+-------+----------+ 
|  1 |  1 | A  | 
|  2 |  2 | A  | 
|  3 |  3 | U  | 
|  4 |  4 | A  | 
|  5 |  5 | A  | 
|  6 |  3 | A  | 
|  7 |  4 | U  | 
|  8 |  5 | A  | 
|  9 |  6 | A  | 
|  10 |  7 | A  | 
|  11 |  3 | A  | 
|  12 |  3 | A  | 
+---------+-------+----------+ 

安全列是一種認可和U對未經授權的。我需要根據其級別排除未授權記錄下的那些記錄。 對於的SQL記錄更好的畫面,它看起來像這樣: enter image description here

那些有箭頭所指是未經授權的記錄,首先要排除那些在它之下。

所以SQL結果應該是如下表:

+---------+-------+----------+ 
| sort_id | level | security | 
+---------+-------+----------+ 
|  1 |  1 | A  | 
|  2 |  2 | A  | 
|  3 |  3 | U  | 
|  6 |  3 | A  | 
|  7 |  4 | U  | 
|  11 |  3 | A  | 
|  12 |  3 | A  | 
+---------+-------+----------+ 

它如何我們可以生產使用簡單的SELECT語句?先謝謝了!只是評論,如果有什麼不清楚。

+1

這是什麼應該表示:「我需要根據他們的級別排除未授權記錄下的那些記錄。」你能更好地解釋這個邏輯嗎? –

+0

我用圖表編輯了我的問題,抱歉讓我感到困惑。 –

回答

1

如果我沒有理解「下擅自記錄」爲指隨繼未經授權的記錄(根據ID)id`s記錄序列,然後在這裏是一種方法:

select sort_id, level, security 
from (select t.*, min(case when authorized = 'U' then id end) over (partition by grp) as minuid 
     from (select t.*, 
        (row_number() over (order by id) - level) as grp 
      from table t 
      ) t 
    ) t 
where id > minuid; 
+0

嗨戈登,它完美的作品!順便說一句,我想了解你所做的Select語句。如果沒關係,你能向我解釋一下嗎?而且,我不熟悉「over」,「partition by」,「row_number()」。非常感謝! –

+0

@ryandy這些被稱爲「分析函數」,是SQL中非常強大的一部分(除了Oracle以外,還可用於數據庫)。要開始的地方是文檔:http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm。 –

+0

感謝您的信息! –