2016-11-07 10 views
-1

システムに連続して入力されたアイテムが1つのユニットとして折りたたまれた結果セットを数えたい場合、結果の文字列/結果セットからインスタンスを数えます。count collapsed continuous results

SELECT items 
FROM table 
WHERE user = 'John Doe' 
ORDER BY date_entered_onto_system 

すなわち時間をかけて、項目が日付順にシステムに入力されたPPP3333PP888P222PPPPPP

私は、アイテムが連続してシステムに入力された文字列を折りたたむすなわちP3P8P2P 、その後の結果の数をカウントしたいですP、ここで答えは= 4

T-SQLの使用事前に多くのお手伝いをありがとう

+0

明確ではありません。単一のアイテムはどのように見えますか?なぜPで列を数えるだけではないのですか? –

+0

質問を改善するためのヒントについては、[こちら](http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)をお読みください。あなたが使った矛盾したタグの説明を読んでください。適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。 – HABO

+0

私は私がはっきりしていると思ったが、再読みするとどこが混乱するかが分かる。 "P、3、8、2"は個々の項目です - 私は数学的解を提示しないために整数と文字の混合を使用しました。つまり、「車、バス、バス、iPad、iPad、iPad、靴、車、車」のように簡単に「車、バス、iPad、靴」にすることができます。そして、私は "車、バス、iPad、靴、車"に減らしたいと考えています。 – MisterO

答えて

0

私はあなたがSQL Server 2012またはそれ以降であると仮定しようとしています。

例データ:

次のコードは、私が質問に提示された例の状況を設定するために使用するものです。

create table #tmp_table (items char(1), date_entered_onto_system datetime) 

insert into #tmp_table values ('P', '2016-11-08 12:01:00') 
insert into #tmp_table values ('P', '2016-11-08 12:02:00') 
insert into #tmp_table values ('P', '2016-11-08 12:03:00') 
insert into #tmp_table values ('3', '2016-11-08 12:04:00') 
insert into #tmp_table values ('3', '2016-11-08 12:05:00') 
insert into #tmp_table values ('3', '2016-11-08 12:06:00') 
insert into #tmp_table values ('3', '2016-11-08 12:07:00') 
insert into #tmp_table values ('P', '2016-11-08 12:08:00') 
insert into #tmp_table values ('P', '2016-11-08 12:09:00') 
insert into #tmp_table values ('8', '2016-11-08 12:10:00') 
insert into #tmp_table values ('8', '2016-11-08 12:11:00') 
insert into #tmp_table values ('8', '2016-11-08 12:12:00') 
insert into #tmp_table values ('P', '2016-11-08 12:13:00') 
insert into #tmp_table values ('2', '2016-11-08 12:14:00') 
insert into #tmp_table values ('P', '2016-11-08 12:15:00') 
insert into #tmp_table values ('P', '2016-11-08 12:16:00') 
insert into #tmp_table values ('P', '2016-11-08 12:17:00') 
insert into #tmp_table values ('P', '2016-11-08 12:18:00') 
insert into #tmp_table values ('P', '2016-11-08 12:19:00') 
insert into #tmp_table values ('P', '2016-11-08 12:20:00') 

回答:

このクエリはlag()機能とSQL Server 2012以降で利用可能ですover節(下記リンク)を使用しています。このクエリは、行とその前の行との間のitemsの値を比較します(date_entered_onto_systemの値に従って時系列に並んでいます)。カウントする必要がある場合は1に、そうでない場合は0に評価し、次にsumを値にします。

Lag Function

Over Clause

select b.items 
, sum(b.sum_val) as items_cnt 
from (
    select a.items 
    , case when a.items = lag(a.items, 1, NULL) over (order by a.date_entered_onto_system asc) then 0 else 1 end as sum_val 
    from #tmp_table as a 
    ) as b 
group by b.items 

結果:

これは、例えばデータの出力です。

items items_cnt 
    2  1 
    3  1 
    8  1 
    P  4 
+0

ありがとう@tarheel。私はそれがTSQLになるので、入力のおかげでうなずきだ。大変感謝しています。 – MisterO

+0

@MisterO問題はない、私の前提が真実であることが判明してうれしい。これで問題が解決した場合は、必ず正式回答としてチェックマークをクリックしてください。それが私に知らされなければ、何をする必要があるかがわかります。 – tarheel

+0

@MisterOこれはどのようになったのですか? – tarheel