2014-04-12 74 views
0

這是我的表。SQL查詢在兩個連續的真值之前選擇行

Price Volume 
------------------ 
60   0 
70   10 
80   0 
90   0 
100   40 
200   40 
300   40 
400   0 
500   50 
600   60 

它由Price定購。

我需要選擇Volume列中兩個連續零之前的所有行。所以結果應該看起來像

Price Volume 
------------------ 
100   40 
200   40 
300   40 
400   0 
500   50 
600   60 

我真的不知道從哪種類型的查詢開始。我只能想到將數據拉入C#並將其重新加載回表中。

Regards,

+0

您正在使用哪些DBMS?數據庫不適合做這種類型的事情,但有選擇。 – attila

+0

一旦你獲得了數據,在C#中做這件事情不是一種選擇嗎? – NiVeR

+1

您的示例結果實際上是**兩個連續的零後的所有行**,而不是*之前的*。 –

回答

1

標準SQL無法處理此問題。你需要一個遊標來遍歷有序的行並決定輸出什麼,這需要使用一些變量。

根據您使用的RDBMS,您可以編寫一個存儲過程來讀取行並對其進行過濾。否則,您必須讓應用程序執行過濾。

+0

我想我最終會在C#中做到這一點。我只是想確保LEAD和LAG不會在這裏工作。[鏈接](http://stackoverflow.com/questions/3298526/how-can-i-find-duplicate-consecutive-values-in-this-table ) – user1700890

+0

你想確保它不起作用?這是爲什麼? – fancyPants

+0

標準SQL *可以*處理這個問題。 –

0

在sql server 2012+中,您可以使用幾個LAG語句來執行此操作。

滯後了2個先前的值在哪裏時,他們都爲0

2

你不說出你的DBMS,所以這是ANSI SQL:

with flagged as (
    select price, 
     volume, 
     case 
      when volume + lag(volume) over (order by price) = 0 then 1 
      else 0 
     end as rn 
    from prices 
), counted as (
    select price, 
     volume, 
     sum(rn) over (order by price) as cn, 
     rn 
    from flagged 
) 
select price, volume 
from counted 
where cn > 0 and rn = 0 
order by price 

這裏是一個SQLFiddle例如:http://sqlfiddle.com/#!6/b2434/4

+0

優秀的解決方案!也是LAG使用的一個很好的例子。最後我不認爲你需要「音量> 0」。你會錯過價值= 400和容量= 0.你知道如何有效率地使用LAG或LEAD? – user1700890

+0

@ user1700890:我改變了'volume = 0' –