2016-03-27 28 views
1

我有这样的一个表:不同的分组在HANA的订单相同的元素SQL

 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 

我用于创建“等级”列中的代码是:

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 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

这里是一个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 

与样本数据和上述SAP HANA SQLScript代码执行,下面的输出被访问

enter image description here

对于捕捉改变组号的数据,我用SQL Lag() function这是非常simil ar在两个数据库平台上SAP HANA和SQL Server

Row_Number()函数与分区By子句是其他SQLScript函数(与SQL Server相同)可帮助我解决问题。

我希望这是你想要的

+0

非常感谢!它工作完美! –

+0

很高兴听到它工作:) – Eralper

相关问题