2016-03-27 14 views
1

Ich habe eine Tabelle wie folgt aus:Verschiedene Gruppierung für gleiche Elemente durch Aufträge in 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 

Der Code, den ich für die Erstellung der „Rank“ verwendete Säule war:

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" 

Ich möchte Erstellen Sie eine Tabelle, in der die Ränge nach "Batch" sortiert sind, und fügen Sie außerdem eine "Group" -Spalte hinzu, um jede Sitzung (eine Sitzung enthält alle Elemente mit demselben "Schlüssel") wie die folgende zu trennen.

Können Sie mir dabei helfen? Vielen Dank!

 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

Angesichts Ihrer Daten würde diese Abfrage diese Ergebnisse nicht produzieren. –

Antwort

0

hier ein SQLScript Code, mit dem Sie die Gruppierung und Ranking-Werte, wie Sie

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

Mit den Beispieldaten und über SAP HANA SQLScript Codeausführung müssen helfen kann, erhalten, wird die folgende Ausgabe zugegriffen

enter image description here

Für die Datenänderungsgruppennummern zu fangen, verwendete ich SQL Lag() function was sehr simil ist Die Funktion Row_Number() mit der Partition By-Klausel ist eine andere SQLScript-Funktion (wie SQL Server), die mir hilft, das Problem zu lösen.

Ich hoffe, das ist, was Sie wollen

+0

Vielen Dank! Es funktioniert perfekt! –

+0

Gut zu hören, es hat funktioniert :) – Eralper

Verwandte Themen