2016-09-20 6 views
-2
+---+------------+ 
| V | output  | 
+---+------------+ 
| y |   1 | 
| y |   2 | 
| y |   3 | 
| N |   0 | 
| y |   1 | 
| y |   2 | 
| N |   0 | 
| N |   1 | 
+---+------------+ 
+3

できません。 SQLテーブルは、*順序付けられていない*集合を表します。したがって、必要な結果を得るために順序を指定する列が必要です。 –

答えて

0

あなたのサンプル出力は、いくつかは少し複雑で、

は、私はもちろん 私はid列は1から始まり、隙間なくに常時移行することを前提として問題の解決のために SQL recursive queryを使用するのが好ましい方法です。より複雑なケースでは、ROW_NUMBER()関数は、idフィールド以外に追加され、参加しなければならないrownumbers

に設定する必要があります私はそれが

enter image description here

を次のように

--create table bool(id int identity(1,1), bool char(1)) 
--insert into bool values ('Y'),('N'),('Y'),('Y'),('Y'),('N'),('Y'),('N'),('N'),('Y'),('Y'),('Y'),('Y'),('Y'),('N'),('Y'),('Y') 

;with cte as (
    select id, bool curr, bool pre, 1 output from bool where id = 1 
    union all 
    select 
     bool.id, bool.bool curr, cte.curr, 
     case when bool.bool = cte.curr then cte.output + 1 else case when bool.bool = 'Y' then 1 else 0 end end 
    from cte 
    inner join bool on bool.id = cte.id + 1 
) 
select * from cte 

出力され、役に立てば幸い

3

注文情報を持つ列(たとえば、id)があるとします。次に、一緒に表示される「Y」と「N」のグループを特定し、それらを列挙したいとします。

あなたは行番号のトリックの差を利用してこれを行うことができます。これはどのように機能するかを説明

select t.v, 
     row_number() over (partition by v, seqnum_id - seqnum_vid order by id) as output 
from (select t.*, 
      row_number() over (order by id) as seqnum_id, 
      row_number() over (partition v by order by id) as seqnum_vid 
     from t 
    ) t; 

は通常、トリッキーです。サブクエリを実行して、シーケンス番号がどのように見えるのか、識別するグループの違いが一定であるのがわかるようにすることをお勧めします。

関連する問題