2017-12-29 13 views
1
create table #t (Id int, Name nvarchar(max))  

insert into #t 
values (1, 'ABC'), (2, 'ABC'), (3, 'BBB'), (4, 'BBB'), 
     (5, 'BBB'), (6, 'BBB'), (7, 'CCC'), (8, 'BBB'), 
     (9, 'BBB'), (10, 'ABC') 

名列の値をカウントします:私は以下の表に示すように、私はこの結果を取得する方法 は、配列の形でのみ存在する場合は名前の列の値をカウントするSQL Serverでシーケンスの形でのみ存在する場合

| Name | Repetition | 
('ABC'), 2 
('ABC'), 2 
('BBB'), 4 
('BBB'), 4 
('BBB'), 4 
('BBB'), 4 
('CCC'), 1 
('BBB'), 2 
('BBB'), 2 
('ABC'), 1 
+0

以下のような連続した行を数えるのギャップや島々型アプローチを試すことができます彼らはQ&Aに関連していません。 – Brien

+0

なぜあなたは 'BBB'を4回リストアップしますか?なぜ一度だけではないのですか? – mjwills

+1

それは私たちのRequiremnet時系列に同じ名前を持っているその時に私はそれを数えたいとそこにすべての行にCOUNT値を与える –

答えて

0

また場合のC#、jQueryとMVCタグを削除してください

See live demo

select 
    Name, 
    Repetition= count(1) over( partition by r,Name) 
from 
(
    select 
    *, 
    r=id-row_number() over(partition by Name order by Id) 
    from #t 
) t 
order by id 
+0

ありがとうございます。ご確認ください。間違った結果が見つかりました。 テーブル#tを(IdがINT、名前NVARCHAR(MAX))に#tに インサートは 値作成(1、 'ABC')、 (2、 'ABC')、 (3、 'BBB')、 ( 4、 'BBB')、 (5、 'BBB')、 (6、 'BBB')、 (7、 'CCC')、 (8、 'BBB')、 (9、 'BBB' )、 (10、 'ABC')、 (11、 'ABC')、 (12、 'ABC')、 (13、 'ABC')、 (14、 'CCC')、 (15 、 'ABC')、 (16、 'ABC')、 (17、 'CCC')、 (18、 'GGG')、 (19、 'FFF')、 (20、 'GGG')、 (21、 'AAA') 名を選択し、 繰り返し=カウント(1) (Rによってパーティション)にわたる から( * を選択し、 R = ID-ROW_NUMBER (IDで名前順にパーティションを分割) から#t ) idで注文 –

+0

@ 176,19,20行を確認してください –

+0

@EnvisionInc。それを指摘していただきありがとうございます。回答の更新と修正 – DhruvJoshi

3

は、この複数のCTEのソリューション試してみてください。しかし効率について

;with name_change as (
    select *, case when name=lag(name, 1) over (order by id) then 0 else 1 end as indicator 
    from t 
), name_group as (
    select name, sum(indicator) over (order by id) as g 
    from name_change 
) 
select name, count(name) over (partition by g) from name_group 

わからないが、私はそれはあなたが必要なものを提供しますだと思う...

SQLFiddle

+0

を確認してください、私たちはSQL Server 2008 r2で作業しており、遅延機能は利用できません。代わりのクエリを提供してください。 私は以前のクエリを提供したのと同じ結果が必要です –

関連する問題