Benutzer mit den meisten Antworten
Fensterfunktion Rank()

Frage
-
Hallo,
Ich habe folgende Spalte:
Start
2015-05-19 01:34:23.0000000
2015-05-19 01:34:25.0000000
2015-05-19 01:34:27.0000000
2015-05-19 04:20:47.0000000
2015-05-19 04:20:49.0000000
2015-05-19 04:20:51.0000000
2015-05-19 05:34:22.0000000
2015-05-19 05:34:24.0000000
2015-05-19 05:34:26.0000000
2015-05-19 08:20:45.0000000Und würde sie gerne wie folgt einem Rang zuordnen
TimestampStart Rang
2015-05-19 01:34:23.0000000 1
2015-05-19 01:34:25.0000000 1
2015-05-19 01:34:27.0000000 1
2015-05-19 04:20:47.0000000 2
2015-05-19 04:20:49.0000000 2
2015-05-19 04:20:51.0000000 2
2015-05-19 05:34:22.0000000 3
2015-05-19 05:34:24.0000000 3
2015-05-19 05:34:26.0000000 3
2015-05-19 08:20:45.0000000 4
Die Bedingung ist der Abstand darf nicht größer sein als 10 Sekunden. Wie stell ich das an?
Danke
- Bearbeitet KaBa88 Dienstag, 19. Mai 2015 09:32
Antworten
-
Hallo!
Du meinst sicher DENSE_RANK(), oder?Falls Du die Daten immer nach Zeitetappen von 10 Sekunden zusammen fassen willst, würde ich dies als Insel-Problem lösen.
Siehe hierzu die ausführliche Beschreibung in meinem blog:
http://www.insidesql.org/blogs/cmu/sql_server/dateninseln-erkennen-und-auswertenDas Skript sieht dann so aus:
Declare @Daten as Table(Zeit datetime); -- Start Insert into @Daten (Zeit) values('20150519 01:34:23'); Insert into @Daten (Zeit) values('20150519 01:34:25'); Insert into @Daten (Zeit) values('20150519 01:34:27'); Insert into @Daten (Zeit) values('20150519 04:20:47'); Insert into @Daten (Zeit) values('20150519 04:20:49'); Insert into @Daten (Zeit) values('20150519 04:20:51'); Insert into @Daten (Zeit) values('20150519 05:34:22'); Insert into @Daten (Zeit) values('20150519 05:34:24'); Insert into @Daten (Zeit) values('20150519 05:34:26'); Insert into @Daten (Zeit) values('20150519 08:20:45'); /* Select Zeit, DATEDIFF(SECOND, '2015-01-01', Zeit)/10 AS Nummerierung from @Daten; */ WITH Inseln AS (SELECT Zeit, DATEDIFF(SECOND, '2015-01-01', Zeit)/10 - DENSE_RANK() OVER(ORDER BY DATEDIFF(SECOND, '2015-01-01', Zeit)/10) AS Diff FROM @Daten ) SELECT Zeit, RANK() OVER(Order by Diff) AS Rang, DENSE_RANK() OVER(Order by Diff) AS Rang_lückenlos FROM Inseln ;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort markiert KaBa88 Mittwoch, 20. Mai 2015 12:41
Alle Antworten
-
Hallo!
Du meinst sicher DENSE_RANK(), oder?Falls Du die Daten immer nach Zeitetappen von 10 Sekunden zusammen fassen willst, würde ich dies als Insel-Problem lösen.
Siehe hierzu die ausführliche Beschreibung in meinem blog:
http://www.insidesql.org/blogs/cmu/sql_server/dateninseln-erkennen-und-auswertenDas Skript sieht dann so aus:
Declare @Daten as Table(Zeit datetime); -- Start Insert into @Daten (Zeit) values('20150519 01:34:23'); Insert into @Daten (Zeit) values('20150519 01:34:25'); Insert into @Daten (Zeit) values('20150519 01:34:27'); Insert into @Daten (Zeit) values('20150519 04:20:47'); Insert into @Daten (Zeit) values('20150519 04:20:49'); Insert into @Daten (Zeit) values('20150519 04:20:51'); Insert into @Daten (Zeit) values('20150519 05:34:22'); Insert into @Daten (Zeit) values('20150519 05:34:24'); Insert into @Daten (Zeit) values('20150519 05:34:26'); Insert into @Daten (Zeit) values('20150519 08:20:45'); /* Select Zeit, DATEDIFF(SECOND, '2015-01-01', Zeit)/10 AS Nummerierung from @Daten; */ WITH Inseln AS (SELECT Zeit, DATEDIFF(SECOND, '2015-01-01', Zeit)/10 - DENSE_RANK() OVER(ORDER BY DATEDIFF(SECOND, '2015-01-01', Zeit)/10) AS Diff FROM @Daten ) SELECT Zeit, RANK() OVER(Order by Diff) AS Rang, DENSE_RANK() OVER(Order by Diff) AS Rang_lückenlos FROM Inseln ;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort markiert KaBa88 Mittwoch, 20. Mai 2015 12:41
-