查询SQL求解

建个测试表:
create table t_num(id integer,num number);
insert into t_num values(1,100);
insert into t_num values(2,90);
insert into t_num values(3,0);
insert into t_num values(4,10);
insert into t_num values(5,20);
insert into t_num values(6,50);
insert into t_num values(7,0);
insert into t_num values(8,10);
insert into t_num values(9,20);
commit;

表内容如下:
SQL> select * from t_num;
        ID        NUM
---------- ----------
         1        100
         2         90
         3          0
         4         10
         5         20
         6         50
         7          0
         8         10
         9         20

要求:记录按顺序显示,但只显示最后一个NUM为0记录后面的记录(不显示0记录)。
        ID        NUM
---------- ----------
         8         10
         9         20
这样的查询SQL该如何写。数据库为Oracle数据库。一般情况下记录不多。

想了一个办法,不太好,有没有人有更好的办法?
select id,num from (
    select id,num,
         sum(case when num=0 then 0 else 1 end) over(order by id desc rows between unbounded preceding and 0 following)
         - row_number() over (order by id desc) judge_code
    from t_num
) where judge_code=0 order by id
执行结果:
        ID        NUM
---------- ----------
         8         10
         9         20

2012-07-26
有热心人回答,谢谢,不错,很简单:
select *
  from t_num t
where t.id > (select max(id) from t_num tn where tn.num = 0);

想了一下,有个小问题。如果没有0记录时,会显示不出东西。假定id都大于0,可以加个nvl,即nvl(max(id),0)

============================================
今天又看了看我的实际情况,情况再变化一下,要求显示最后一个0后面所有数据及0上面一条数据(如果有的话),这个该如何写呢?注:ID不一定连续。

        ID        NUM
---------- ----------
         6         50
         7          0
         8         10
         9         20

想到了,可以用统计函数lead来解决。
select *
  from t_num t
where t.id >= (select nvl(max(id),0) from
             (select id,lead(num) over (order by id) num2,num from t_num) tn
              where tn.num2 = 0);

你可能感兴趣的:(oracle,sql)