2017-12-16 1 views
0

ich einen wertvollen Artikel gelesen habe, die erklären, wie die Anzahl der Zeilen an dieser Verbindung für jede diskrete Zeit vorhanden zählen: Intervals and Counts - part1SQL - Erstellen von Artikeln basierend Sätze auf Intervalldaten

Die Idee ist, zunächst für jedes Ereignis Erstellen Sie die Sequenz, die die Start- und Endzeiten darstellt, packen Sie diese Intervalle und zählen Sie die Anzahl der Zeilen für jede App.

Das Problem, das ich habe, ist ein wenig anders. Ich habe die gleichen Daten den gleichen Prozess hat und erreicht eine Tabelle wie folgt aus:

StartTime  EndTime  App 
1    5    A 
8    9    A 
3    9    B 
1    9    C 

Der Ausgang ist mein Wunsch Itemsets von Co-auftretende Anwendungen. Wenn Sie diese Intervalle auf ein Zeitdiagramm legen, können Sie verstehen, was ich möchte.

Dies ist die Ausgabe Ich suche nach:

StartTime  EndTime  AppsOpen  TimeSpan 
1    3    A,C   2 
3    5    A,B,C   2 
5    8    B,C   3 
8    9    A,B,C   1 

HINWEIS: Die Spalte TimeSpan nur die Subtraktion von EndTime und StartTime ist.

ps: Ich bin mit SQL Server 2014

Antwort

0

Nach einiger Überlegung entschied ich mich, um herauszufinden, wie ich den Schluss Intervalle extrahieren könnte (zB: [1: 3], [3: 5], [5: 8 ], [8: 9]).

Danach konnte ich nur die Zeilen auswählen, die entweder die Intervalle enthalten oder von ihnen enthalten sind.

Die letzte Abfrage sieht wie folgt aus:

Anmerkung: der Kürze halber abgebildet ich die Spalte und Tabelle Namen wie folgt aus:

"Ts" bedeutet "Starttime",

„Te "bedeutet" EndTime ",

" E "ist die Haupttabelle wie oben beschrieben.

with p as (select distinct ts from E union select distinct te from E) 
, q as (select ts, lead(ts) over (order by ts) as te from p) 
, X as (select q.Ts, q.Te, app from E inner join q on 
      (E.Ts >= q.Ts and E.Ts < q.Te) -- started in the interval 
      or 
      (E.Ts <= q.Ts and E.Te > q.Ts)-- started before the interval but present during interval 
      ) 

select Ts,Te, STUFF((SELECT ', ' + CAST(App AS VARCHAR(MAX)) 
         FROM X y WHERE (y.Ts = x.Ts and y.Te = x.Te) 
         FOR XML PATH(''),TYPE 
         ).value('.','VARCHAR(MAX)') ,1,2,'') from X x group by Ts,Te 

Dennoch sind neue Ideen oder bessere Wege begrüßt.

Verwandte Themen