2017-12-29 54 views
4

を変更したときに、以下のDDLをご覧下さい奇数として行番号を開始:レコードをグループ化し、パーティションが

create table Test (RevObjId int, LegalPartyId int, IsPrimary int) 

insert into Test (RevObjId, LegalPartyId, IsPrimary) values (10, 20, 0) 
insert into Test (RevObjId, LegalPartyId, IsPrimary) values (10, 21, 0) 
insert into Test (RevObjId, LegalPartyId, IsPrimary) values (10, 22, 1) 
insert into Test (RevObjId, LegalPartyId, IsPrimary) values (11, 20, 1) 
insert into Test (RevObjId, LegalPartyId, IsPrimary) values (11, 21, 0) 
insert into Test (RevObjId, LegalPartyId, IsPrimary) values (12, 30, 1) 
insert into Test (RevObjId, LegalPartyId, IsPrimary) values (13, 40, 0) 

を、私は以下の出力を探しています:私は次のクエリを使用する場合

RevObjId LegalPartyId IsPrimary RowNumber 
10 22 1 1 
10 20 0 2 
10 21 0 3 
11 20 1 5 
11 21 0 6 
12 30 1 7 
13 40 0 9 

select RevObjId, 
     LegalPartyId, 
     IsPrimary, 
     row_number() over(partition by RevObjId order by RevObjId asc,IsPrimary desc,LegalPartyId asc) as RowNumber 
     from test; 

私は順番に行番号を取得し、各行は1ずつ増加し、行番号はリセットされます。パーティションが変更された後パーティション(RevObjIdによる)が変更されたときに、行番号を次の奇数に変更するにはどうすればよいですか? は、ここで私は、次の形式でレポートを生成する必要があるので、私たちは、行番号の間のギャップを必要とする私のSQLフィドル http://sqlfiddle.com/#!6/01d5c/22

です。ここで enter image description here

私が求めていたサポート質問です: How to convert every other row to column in T-SQL?

+1

ギャップの背後にある論理は何ですか?新しいRevObjIdが見つかると、行番号は偶数の場合は奇数に切り上げる必要がありますか?そして、どのバージョンのSQL Server? –

+0

@MartinSmith:私は自分の質問を更新しました。 –

+0

@RadimBača:いいえ正しいですが、RevObjIdが変更された場合、次の奇数に変更するにはrownumberが必要です。申し訳ありませんが十分に明確ではありません。 –

答えて

3

これに対するニーズは非常に疑っているが、私は、これはそれを行うべきだと思います。

ギャップが発生するのは、前のパーティションに奇数の行があり、ギャップが1行のときだけです。これにより、奇数行の前のパーティションの実行カウントが追跡され、そのような各パーティションの行数の合計に1が加算されます。

WITH T 
    AS (SELECT RevObjId, 
       LegalPartyId, 
       IsPrimary, 
       odd_adj = CASE 
          WHEN RevObjId = LEAD(RevObjId) 
            OVER (ORDER BY RevObjId ASC, IsPrimary DESC, LegalPartyId ASC) 
           THEN 0 
          ELSE ROW_NUMBER() /*We are in the last row of the partition so can use rownumber as a more efficient alternative to count*/ 
            OVER (PARTITION BY RevObjId ORDER BY IsPrimary DESC, LegalPartyId ASC)%2 
          END, 
       RowNumber = ROW_NUMBER() 
           OVER(ORDER BY RevObjId ASC, IsPrimary DESC, LegalPartyId ASC) 
     FROM test) 
SELECT RevObjId, 
     LegalPartyId, 
     IsPrimary, 
     RowNumber 
      + SUM(odd_adj) OVER (ORDER BY RevObjId 
           ROWS UNBOUNDED PRECEDING) 
      - odd_adj AS RowNumber /*odd_adj is only potentially non zero for the last row in each partition 
            - if we are in the last row and it is 1 we need to deduct it 
            as this is not a previous partition */ 
FROM T; 

SQL Fiddle

0

with groupcount as 
(
    select RevObjId, (count(*) + 1)/ 2 * 2 as c 
    from test 
    group by RevObjId 
), RevObjIdRN as 
(
    select RevObjId, LegalPartyId, IsPrimary, 
     row_number() over (partition by RevObjId order by IsPrimary desc,LegalPartyId asc) as rn 
    from test 
) 
select t2.RevObjId, t2.LegalPartyId, t2.IsPrimary, rn + relative 
from (
    select RevObjId, sum(c) over (order by RevObjId) - c as relative 
    from groupcount 
) t1 
join RevObjIdRN t2 on t1.RevObjId = t2.RevObjId 

sqlfiddle

を次のように解決策は以下の部分に基づいており、それを試してみてください。

with groupcount as 
(
    select RevObjId, (count(*) + 1)/ 2 * 2 c 
    from test 
    group by RevObjId 
) 
select RevObjId, sum(c) over (order by RevObjId) - c as relative 
from groupcount 

は、RevObjIdRevObjIdオフセット)のグループごとに開始row_numberを返します。残りの部分は、このオフセットにRevObjIdのそれぞれにrow_number()を追加するだけです。

関連する問題