SQL查询在两个连续的真值之前选择行

时间:2014-04-12 21:41:36

标签: sql sql-server-express

这是我的桌子。

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

按价格订购。

我需要在Volume列中的两个连续零之前选择所有行。所以结果看起来应该是

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

我真的不知道从哪种类型的查询开始。我只能考虑将数据拉入C#并加载回表。

此致

3 个答案:

答案 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

答案 1 :(得分:1)

标准SQL无法处理此问题。您需要一个游标循环遍历有序行并决定输出什么,这需要使用一些变量。

根据您使用的RDBMS,您可以编写一个读取行并过滤它们的存储过程。否则,您必须让应用程序进行过滤。

答案 2 :(得分:0)

在sql server 2012+中,您可以使用几个LAG语句执行此操作。

前2个值的滞后以及它们都为0的位置。