2017-12-16 2 views
-5

Ich brauche eine Trichteranalyse. Wie kann ich Rohdaten mit SQL transformieren?Wie transformiere ich diese rohe Tabelle mit SQL?

Mein Ansatz war

  1. Fall, wenn (Zeit diff über partitionierten uid geordnete Zeit bekommen)> 1min ( dies ist eine Schwelle). dann 1. else 0 end alias start.

  2. und groupby Start erhalten Cumsum.

  3. und groupby cumsum concat Ereignis

Ich denke, dieser Prozess sehr lange dauern würde und wie BEGIN_DATE und end_date zu bekommen. Ich weiß nicht, wie Sie die SQL-Anweisung genau abfragen.

enter image description here

+3

Sie keine Bilder von Daten (würden Sie ein Bild von einer Lösung Abfrage wie?). Bitte geben Sie Ihre Beispieldaten als Texttabelle in Ihre Frage ein, dann können wir vielleicht antworten. Die Angabe der Abfrage, die Sie zu verwenden versucht haben, sagt uns auch nützliche Dinge, z. Der Tabellenname –

+0

fand ganz zufällig eine [gelöschte Frage] (https://stackoverflow.com/questions/47839900/sql-to-get-transformed-data-from-this-raw-data-for-funnel-analysis) mit den Daten im Text ... du hättest das anstelle des Bildes verwenden können. –

+0

Dies könnte eine gute und nützliche Frage sein, wenn Sie sich die Zeit genommen hätten, die oben gegebenen Anweisungen zu befolgen. –

Antwort

1

Hier ist eine Art und Weise, Demo auf SQL Fiddle

CREATE TABLE Table1 
    ("id" int, "datetime" time, "name" varchar(1)) 
; 

INSERT INTO Table1 
    ("id", "datetime", "name") 
VALUES 
    (1, '11:10:01', 'A'), 
    (1, '11:10:02', 'A'), 
    (1, '11:10:05', 'B'), 
    (1, '11:12:02', 'A'), 
    (1, '11:12:10', 'A'), 
    (2, '11:13:02', 'B'), 
    (2, '11:13:06', 'A'), 
    (1, '11:14:01', 'A'), 
    (1, '11:14:02', 'B'), 
    (1, '11:14:05', 'A') 
; 

Abfrage 1:

with cte as (
    select 
    id, datetime, name 
    , row_number() over(partition by id, date_trunc('minute',datetime) order by datetime) rn 
    , lead(name) over(partition by id, date_trunc('minute',datetime) order by datetime) lead_name 
    from table1 
) 
, cte2 as (
    select 
    id, date_trunc('minute',datetime) t, concat(name,lead_name) pair 
    from cte 
    where lead_name IS NOT NULL 
    ) 
select 
     id 
    , t 
    , count(case when pair = 'AA' then 1 end) as AA 
    , count(case when pair = 'AB' then 1 end) as AB 
    , count(case when pair = 'BA' then 1 end) as BA 
    , count(case when pair = 'BB' then 1 end) as BB 
from cte2 
group by 
     id 
    , t 
order by 
     id 
    , t 
; 

Results:

| id |            t | aa | ab | ba | bb | 
|----|--------------------------------------------------|----|----|----|----| 
| 1 | 0 years 0 mons 0 days 11 hours 10 mins 0.00 secs | 1 | 1 | 0 | 0 | 
| 1 | 0 years 0 mons 0 days 11 hours 12 mins 0.00 secs | 1 | 0 | 0 | 0 | 
| 1 | 0 years 0 mons 0 days 11 hours 14 mins 0.00 secs | 0 | 1 | 1 | 0 | 
| 2 | 0 years 0 mons 0 days 11 hours 13 mins 0.00 secs | 0 | 0 | 1 | 0 | 

Abfrage v2:

with cte as (
    select 
    id, datetime, name 
    , row_number() over(partition by id order by datetime) rn 
    , lead(name) over(partition by id order by datetime) lead_name 
    from table1 
) 
, cte2 as (
    select 
    id, date_trunc('minute',datetime) t, concat(name,lead_name) pair 
    from cte 
    where lead_name IS NOT NULL 
    ) 
select 
     id 
    , t 
    , count(case when pair = 'AA' then 1 end) as AA 
    , count(case when pair = 'AB' then 1 end) as AB 
    , count(case when pair = 'BA' then 1 end) as BA 
    , count(case when pair = 'BB' then 1 end) as BB 
from cte2 
group by 
     id 
    , t 
order by 
     id 
    , t 
; 

Results v2:

| id |            t | aa | ab | ba | bb | 
|----|--------------------------------------------------|----|----|----|----| 
| 1 | 0 years 0 mons 0 days 11 hours 10 mins 0.00 secs | 1 | 1 | 1 | 0 | 
| 1 | 0 years 0 mons 0 days 11 hours 12 mins 0.00 secs | 2 | 0 | 0 | 0 | 
| 1 | 0 years 0 mons 0 days 11 hours 14 mins 0.00 secs | 0 | 1 | 1 | 0 | 
| 2 | 0 years 0 mons 0 days 11 hours 13 mins 0.00 secs | 0 | 0 | 1 | 0 | 
+0

Danke für die Annahme. Wenn Sie [diese Query-Variante] (http://sqlfiddle.com/#!17/8b5ba/2) betrachten, wenn Sie ** ', date_trunc ('minute', datetime)' von der row_number() und entfernen lead() Partitionen kann es eine genauere Lösung sein. –