2017-03-27 24 views
1
SNO  Status 
    1  Entering  
    2  Entering 
    3  Assigned  
    4  Denied 
    5  Assigned 

上記の値はクエリの出力の一部です。 ステータスカラムは、連続して(Sno 1と2の場合)発生するので、1つだけ 'Entering'を返す必要があります。 他の行は影響を受けません。たとえば、「割り当て済み」の場合は、継続的に発生しないためです。いくつかの論理チェックとクエリ内で1つの値のみを選択する方法

答えて

2

lag()は、あなたが欲しいものを行う必要があります。

with q as (< your query here>) 
select sno, status 
from (select q.*, lag(status) over (order by sno) as prev_status 
     from q 
    ) q 
where prev_status is null or prev_status <> status; 
2

SNO sがギャップのない連続している、あなたはEXISTSを使用できると仮定すると:

SELECT * 
FROM MyTable t 
WHERE NOT EXISTS (
    SELECT * FROM MyTable x WHERE t.SNO=x.SNO-1 AND t.Status=x.Status 
) 

WHEREで相関サブクエリStatusと一致する行を拒否して、SNO-1を調べます。

+0

ほとんどのOracleデータベースでは、「想定しない...ギャップがない」というのは現実的な前提ではありません。 –

+0

@MatthewMcPeak 'SNO'は非常にうまくユーザー割り当てされているかもしれません。その場合、シーケンスにno-gapがあるという仮定は、もはや不合理ではありません。 – dasblinkenlight

関連する問題