none
Fensterfunktion Rank() RRS feed

  • 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.0000000

    Und 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
    Dienstag, 19. Mai 2015 09:29

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

    Das 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
    Dienstag, 19. Mai 2015 12:55

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

    Das 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
    Dienstag, 19. Mai 2015 12:55
  • Hallo Christoph,

    Genau nach so einer Lösung habe ich gesucht. Danke für ihre Hilfe. Ihr Beitrag in ihrem Blog hat mir sehr geholfen. Diese Vorgehensweise, kann mir noch vieles mehr vereinfachen. Danke für Ihren Beitrag.

    Ihnen auch einen schönen Tag

    Mittwoch, 20. Mai 2015 12:45