这是我的桌子。
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#并加载回表。
此致
答案 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的位置。