2016-03-27 7 views
1

私はこのようなテーブルがあります。私がしたい異なるグループ

SELECT "NanoTime","Sensor", "Key", 
    ROW_NUMBER() OVER (PARTITION BY "Sensor", "Key" ORDER BY "NanoTime" ASC) as RANK 
FROM TEST 
WHERE "Sensor" = 'Gyroscope' 
GROUP BY "NanoTime","Sensor", "Key" 

 NanoTime   Sensor Key Rank 
15,899,129,832,916  Gyroscope i  1 
15,899,132,632,874  Gyroscope i  2 
15,899,152,377,999  Gyroscope i  3 
15,900,080,214,835  Gyroscope o  1 
15,900,092,388,626  Gyroscope o  2 
15,900,112,529,501  Gyroscope o  3 
15,971,592,577,285  Gyroscope i  4 
15,971,592,739,660  Gyroscope i  5 
15,971,612,339,952  Gyroscope i  6 
15,971,632,305,202  Gyroscope i  7 
15,972,579,736,201  Gyroscope o  4 
15,972,592,583,743  Gyroscope o  5 
15,972,612,371,701  Gyroscope o  6 

私は「ランク」欄にして作成するために使用されるコードをランクが「バッチ」でソートされたテーブルを作成し、以下のような各セッション(1つのセッションには同じ「キー」を持つすべての要素が含まれています)を区切る「グループ」列も含めます。

お手伝いできますか?ありがとうございました!ここで

 NanoTime   Sensor Key Rank Group 
15,899,129,832,916  Gyroscope i  1  1 
15,899,132,632,874  Gyroscope i  2  1 
15,899,152,377,999  Gyroscope i  3  1 
15,900,080,214,835  Gyroscope o  1  2 
15,900,092,388,626  Gyroscope o  2  2 
15,900,112,529,501  Gyroscope o  3  2 
15,971,592,577,285  Gyroscope i  1  3 
15,971,592,739,660  Gyroscope i  2  3 
15,971,612,339,952  Gyroscope i  3  3 
15,971,632,305,202  Gyroscope i  4  3 
15,972,579,736,201  Gyroscope o  1  4 
15,972,592,583,743  Gyroscope o  2  4 
15,972,612,371,701  Gyroscope o  3  4 
+0

あなたのデータが与えられた場合、そのクエリはそれらの結果を生成しません。 –

答えて

0

は、あなたがサンプルデータとし、SAP HANA SQLScriptコードの実行上記

--create table Nano (NanoTime varchar(30), Sensor varchar(30), key char(1)) 
/* 
insert into Nano values ('15,899,129,832,916','Gyroscope','i');--  1 
insert into Nano values ('15,899,132,632,874','Gyroscope','i');--  2 
insert into Nano values ('15,899,152,377,999','Gyroscope','i');--  3 
insert into Nano values ('15,900,080,214,835','Gyroscope','o');--  1 
insert into Nano values ('15,900,092,388,626','Gyroscope','o');--  2 
insert into Nano values ('15,900,112,529,501','Gyroscope','o');--  3 
insert into Nano values ('15,971,592,577,285','Gyroscope','i');--  4 
insert into Nano values ('15,971,592,739,660','Gyroscope','i');--  5 
insert into Nano values ('15,971,612,339,952','Gyroscope','i');--  6 
insert into Nano values ('15,971,632,305,202','Gyroscope','i');--  7 
insert into Nano values ('15,972,579,736,201','Gyroscope','o');--  4 
insert into Nano values ('15,972,592,583,743','Gyroscope','o');--  5 
insert into Nano values ('15,972,612,371,701','Gyroscope','o');--  6 
*/ 

with cte as (
    select 
     *, 
     lag(Sensor,1,'') over (order by NanoTime) previousSensor, 
     lag(key,1,'') over (order by NanoTime) previouskey, 
     case when 
      lag(Sensor,1,'') over (order by NanoTime) = Sensor and 
      lag(key,1,'') over (order by NanoTime) = key 
      then 0 else 1 end ischange 
    from Nano 
    order by NanoTime 
) 
select NanoTime, Sensor, Key, Row_Number() Over (Partition By GroupNo Order By NanoTime) as Rank, GroupNo 
from (
select cte.*, (select sum(x.ischange) from cte x where x.NanoTime <= cte.NanoTime) as groupno 
from cte 
) t 

を必要としてグループ化を得るためにあなたを助けると値をランク付けすることができますSQLScriptコードで、次のような出力がアクセスされます

enter image description here

は、グループ番号を変更するキャッチするデータについては、私は非常にsimilあるSQL Lag() functionを使用しましたar両方のデータベースプラットフォームSAP HANAとSQL Server

Partition By句を使用したRow_Number()関数は、問題を解決するのに役立つSQLスクリプト関数(SQL Serverと同じ)です。

私はこれが欲しいと思います。

+0

ありがとう!それは完璧に動作します! –

+0

うまく聞いてよかった:) – Eralper

関連する問題