2017-05-08 3 views
1

によって私は私がして、グループに希望の列を持つテーブルが、例えば、それの最後のシリーズ(表はで動作するようにタイムスタンプ列を持つ)テーブルを持っているSQLグループはタイミング

Type | Time 
============= 
A | 1:00 
A | 1:05 
B | 1:10 
C | 1:15 
A | 1:20 
A | 1:25 
A | 1:30 

私はこれらをグループ化してグループ化したいと思っています(Sum()、Max()、Avg())。変更が発生したときに知る方法はありません

Type | count_in_series | MinTime 
================================ 
A | 2    | 1:00 
B | 1    | 1:10 
C | 1    | 1:15 
A | 3    | 1:20 

、与えられたデータは、ポイントを説明するためのサンプルだけである:

私のような何かをしたいと思います。

これは可能ですか?

ソリューション

私は以下の回答からのコンセプトでこれを使用していました。私が使用しているプログラムが、変数やCTEに対応していないことが分かります。ここに私の解決策は、サブクエリを使用している。このような

SELECT 
    Type 
    , max(t_stamp) as maxTime 
    , min(t_stamp) as minTime 
FROM 
    (SELECT 
     * 
     , ROW_NUMBER() OVER (ORDER BY t_stamp desc) - ROW_NUMBER() OVER (PARTITION BY Type ORDER BY t_stamp desc) as grouping 
    FROM MyTable) as t1 
GROUP BY t1.grouping, t1.Type 
ORDER BY min(t_stamp) desc 
+3

? SQLサーバー?オラクル? – GurV

+0

ウィンドウ関数Lead()は、エンジンがサポートしている場合に役立ちます。そうでない場合は、ユーザー変数を使用して行番号を割り当て、row_number + 1 = rowNumberに結合し、T1.TypeをT2.Typeと比較すると、異なるリセットカウント時に同じadd countを比較できます。 – xQbert

+0

@GurwinderSingh SQLは点火クライアントを介して表現します – Evan

答えて

1

あなたはLAGを持っていけない場合は、あなただけのROW_NUMBER()

SQL DEMOを使用することができます

With CTE AS (
    SELECT T.*,   
      ROW_NUMBER() OVER (ORDER BY [TIME]) as ID, 
      ROW_NUMBER() OVER (PARTITION BY [Type] ORDER BY [TIME]) as rn 
    FROM Table1 T  
) 
SELECT [Type], COUNT(*) Count , MIN(Time) Time 
FROM CTE 
GROUP BY [Type], ID - rn 
ORDER BY MIN(Time) 

OUTPUTを使用しているDBMS

enter image description here

+1

正しいです。ありがとう、私の質問を参照して私が使用したソリューションの編集 – Evan

0

何か作業をする必要があります:

SELECT 
    Type, 
    count('Type'), 
    min('Time') 
FROM table 
GROUP BY Type 

-----あなたができる場合-------
Check this SQL fiddle
を編集しました

SET @typeIndex = 1; 

SELECT 
    min(type) as type, 
    count(type) as count, 
    min(TIME_FORMAT(time, '%H %i')) as minTime 
FROM(
    SELECT 
    t.type, 
    t.time, 
    (SELECT type FROM timeTest tt 
     WHERE tt.time < t.time 
     ORDER BY time DESC LIMIT 1) as next_type, 
    IF(type != (SELECT type FROM timeTest tt 
     WHERE tt.time < t.time 
     ORDER BY time DESC LIMIT 1), @typeIndex := @typeIndex+1, "") as t , 
    @typeIndex as tipeIndex 
    FROM 
    timeTest t 
) temp 
GROUP BY temp.tipeIndex 
+2

期待通りの結果で2 "A"を見てください。基本的には型が変わるまでカウントしてからカウントをリセットします。各グループの最小時間を表示します。 – xQbert

+0

申し訳ありませんが、私はそれを忘れて、このフィドルを確認してください:http://sqlfiddle.com/#!9/eb22c9/29。 – Cyrus

+0

私が使用しているクライアントは、変数またはWITH CTEを許可していませんが、サブクエリを使用して解決策を考え出しました。ありがとう、私の質問を参照してください私が使用した解決のための編集 – Evan

1

正しいバケットを取得してからgrou以下のようによりp:

;with cte as (
select *, Bucket = sum(sm) over (order by RowN) from (
select *,sm = case when (lag(type,1) over (order by [time]) <> [type]) then 1 else 0 end, 
    RowN= row_number() over(order by [time]) from #yourtime 
    ) a 
    ) 
    select min([Type]) as [Type], count([Type]) as Count_in_Series, min([time]) as MinTime from cte 
    group by Bucket 

あなたの出力:

+------+-----------------+------------------+ 
| Type | Count_in_Series |  MinTime  | 
+------+-----------------+------------------+ 
| A |    2 | 01:00:00.0000000 | 
| B |    1 | 01:10:00.0000000 | 
| C |    1 | 01:15:00.0000000 | 
| A |    3 | 01:20:00.0000000 | 
+------+-----------------+------------------+ 

ご入力テーブル:

create table #yourtime (type varchar(2), [Time] time) 

insert into #yourtime ([type], [time]) values 
('A','1:00') 
,('A','1:05') 
,('B','1:10') 
,('C','1:15') 
,('A','1:20') 
,('A','1:25') 
,('A','1:30') 
+0

なぜ使用していない 'オーバー([時間]で注文)' ?? –

+0

あなたは例のインデックスとパーティションの 'ORDER BY'を含めない限り、私たちはそのシーケンスを必要として、遅れを –

+0

デシベルテーブルが順序付けられていないデータセットされ、それがテーブルに格納されているどのようにあなたを入力順序を取るために**カント** guarantedする順序を言っていますデータが異なって保存されているので、あなたに異なる結果を与えることができます。.. –