Gruppieren nach Intervall und Bedingung

GrafvonAdviller

Benutzer
Beiträge
12
Guten Morgen,

ich suche nach einer Möglichkeit Zeitintervalle zu gruppieren.
Hier mal ein Beispiel:
Beispiel_Tabelle.png

Die Gelb markierten Felder führen dazu das ich nicht weiter komme.
Bei diesen Feldern ist alles bis auf der Time_Stamp gleich. Dadurch finde ich aktuell keine Möglichkeit dies sinvoll zu gruppieren.
Ich benötige im Prinzip den Zeitstempel des nachfolgenden TYP`s der gleichen AREA, LINE, STATION, STATION_INDEX um dies als meinen Endzeitpunkt zu nutzen.

Kurz um. Ich brauch den Zeitraum wann welches Los gefertigt wurde um dies mit meiner Tabelle der Log informationen zu Joinen.

Vielen Dank schon mal für euerer Antworten und Anregungen
 
Werbung:
Hmm, so ganz kapiere ich nicht was Du willst, aber wenn Du den Start und das Ende suchst, kannst Du dann nicht einfach ein GROUP BY mit min() und max() verwenden?
Code:
select area, line, station_station_index, 
       min(time_stamp_local) as anfang, 
       max(time_stamp_local) as ende
from the_table
group by area, line, station_station_index
 
auch ich verstehe nicht wirklich, was Du erreichen willst.

Wenn der Herr Graf vielleicht so nett wäre, statt Bilder gleich SQL-Statements zur Erstellen und Befüllen einer Tabelle mit den Beispieldaten zu zeigen und auch gleich noch, was rauskommen soll, wäre es hilfreich. Bilder male ich nicht ab ...
 
Dann vielleicht sowas?
Code:
select area, line, station_station_index, time_stamp_local,
      lead(time_stamp_local) over (partition by area, line, station_station_index order by time_stamp_local) as next_timestamp
from the_table
 
Sorry, ich habs jetzt nochmal etwas einfacher und verständlicher gestrickt.

Hier die eine vereinfachte Tabelle wie die Daten vorliegen.
Code:
WITH tabelle(STATION,TYP,[DATE]) AS (
SELECT   1,'A','2018-08-10 02:01:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:02:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:03:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:04:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:05:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:06:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:07:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:08:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:09:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:57:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:58:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:59:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:00:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:01:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:02:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:03:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:04:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:05:00.000'

   )
SELECT *

FROM tabelle

und aussehen sollte es so

Code:
STATION   TYP   Count_of_Events   Start_DATE                End_DATE
1          A              6        2018-08-10 02:01:00.000   2018-08-10 02:06:00.000
1          B              3        2018-08-10 02:07:00.000   2018-08-10 02:09:00.000
1          A              9        2018-08-10 23:57:00.000   2018-08-11 00:05:00.000

Als Alternative dazu würde mich interessieren wie ich als End_DATE des ersten TYP "A" das Start_DATE von "B" setzen kann.
 
Zuletzt bearbeitet:
Code:
WITH tabelle(STATION,TYP,DATE) AS (
SELECT   1,'A','2018-08-10 02:01:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:02:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:03:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:04:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:05:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:06:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:07:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:08:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:09:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:57:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:58:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:59:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:00:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:01:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:02:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:03:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:04:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:05:00.000'
   ), x as (
SELECT *, case when typ != lag(typ) over (order by date) then 'x' else '' end as change
FROM tabelle order by date), tmp as ( select *, sum(case when change is null or change = '' then 0 else 1 end) over (order by date) as g from x) select station, typ, g, min(date), max(date) from tmp group by station, typ, g order by g;
 
hier noch etwas besser lesbar:

Code:
test=*# WITH tabelle(STATION,TYP,DATE) AS (
SELECT   1,'A','2018-08-10 02:01:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:02:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:03:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:04:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:05:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:06:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:07:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:08:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:09:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:57:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:58:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:59:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:00:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:01:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:02:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:03:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:04:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:05:00.000'
   ),

x as (
SELECT *
       , case when typ != lag(typ) over (order by date) then 'x' else '' end as change
FROM tabelle order by date),

tmp as (
select *
       , sum(case when change is null or change = '' then 0 else 1 end) over (order by date) as g from x)

select
     station
     , typ
     , g
     , count(1) as anzahl
     , min(date) as von
     , max(date) as bis
from tmp
group by station, typ, g
order by g;
 station | typ | g | anzahl |           von           |           bis           
---------+-----+---+--------+-------------------------+-------------------------
       1 | A   | 0 |      6 | 2018-08-10 02:01:00.000 | 2018-08-10 02:06:00.000
       1 | B   | 1 |      3 | 2018-08-10 02:07:00.000 | 2018-08-10 02:09:00.000
       1 | A   | 2 |      9 | 2018-08-10 23:57:00.000 | 2018-08-11 00:05:00.000
(3 rows)

test=*#
 
hier noch etwas besser lesbar:

Code:
test=*# WITH tabelle(STATION,TYP,DATE) AS (
SELECT   1,'A','2018-08-10 02:01:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:02:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:03:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:04:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:05:00.000' UNION ALL
SELECT   1,'A','2018-08-10 02:06:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:07:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:08:00.000' UNION ALL
SELECT   1,'B','2018-08-10 02:09:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:57:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:58:00.000' UNION ALL
SELECT   1,'A','2018-08-10 23:59:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:00:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:01:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:02:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:03:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:04:00.000' UNION ALL
SELECT   1,'A','2018-08-11 00:05:00.000'
   ),

x as (
SELECT *
       , case when typ != lag(typ) over (order by date) then 'x' else '' end as change
FROM tabelle order by date),

tmp as (
select *
       , sum(case when change is null or change = '' then 0 else 1 end) over (order by date) as g from x)

select
     station
     , typ
     , g
     , count(1) as anzahl
     , min(date) as von
     , max(date) as bis
from tmp
group by station, typ, g
order by g;
 station | typ | g | anzahl |           von           |           bis          
---------+-----+---+--------+-------------------------+-------------------------
       1 | A   | 0 |      6 | 2018-08-10 02:01:00.000 | 2018-08-10 02:06:00.000
       1 | B   | 1 |      3 | 2018-08-10 02:07:00.000 | 2018-08-10 02:09:00.000
       1 | A   | 2 |      9 | 2018-08-10 23:57:00.000 | 2018-08-11 00:05:00.000
(3 rows)

test=*#

Dein Ergebnis sieht sehr vielversprechned aus. Allerdings kann ich es auf meinem System nicht nachvollziehen, da ich eine Fehlermeldung bekomme.

Msg 1033, Level 15, State 1, Line 25
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.


Meine Systeminfo :

Microsoft SQL Server Management Studio 14.0.17230.0
Microsoft Analysis Services Client Tools 14.0.1016.244
Microsoft Data Access Components (MDAC) 10.0.17763.1
Microsoft MSXML 3.0 6.0
Microsoft Internet Explorer 9.11.17763.0
Microsoft .NET Framework 4.0.30319.42000
Operating System 6.3.17763
 
Perfekt ... Vielen lieben Dank. Das ist genau das was ich gesucht hatte.
Jetzt muss ich das ganze nur noch in die Realität überführen.

Wie müsste das vor dem Teil " x as ( " aussehen? Muss da auch ein WITH rein? Ich hab ein solches Select noch nie gemacht.
Vielen Dank für euere Hilfe
 
Werbung:
Perfekt ... Vielen lieben Dank. Das ist genau das was ich gesucht hatte.
Jetzt muss ich das ganze nur noch in die Realität überführen.

Wie müsste das vor dem Teil " x as ( " aussehen? Muss da auch ein WITH rein? Ich hab ein solches Select noch nie gemacht.
Vielen Dank für euere Hilfe

Hab’s hinbekommen mit der Hilfe eines netten Arbeitskollegen ... Grüße an der Stelle falls du es liest ;)
 
Zurück
Oben