2016-07-19 6 views
0

요구 사항은 10 초 시간 간격을 기준으로 테이블 레코드를 그룹화하는 것입니다. 18시 36분 15초 18시 36분 24초에 사이에있는 모든 레코드를 테이블그룹 SQL 서버의 10 초 간격으로 레코드 별

Id  DateTime   Rank 
1  2011-09-27 18:36:15  1 
2  2011-09-27 18:36:15  1 
3  2011-09-27 18:36:19  1 
4  2011-09-27 18:36:23  1 
5  2011-09-27 18:36:26  1 
6  2011-09-27 18:36:30  1 
7  2011-09-27 18:36:32  1 
8  2011-09-27 18:36:14  2 
9  2011-09-27 18:36:16  2 
10 2011-09-27 18:36:35  2 

그룹이

Id  DateTime   Rank GroupRank 
1  2011-09-27 18:36:15  1   1 
2  2011-09-27 18:36:15  1   1 
3  2011-09-27 18:36:19  1   1 
4  2011-09-27 18:36:23  1   1 
5  2011-09-27 18:36:26  1   2 
6  2011-09-27 18:36:30  1   2 
7  2011-09-27 18:36:32  1   2 
8  2011-09-27 18:36:14  2   3 
9  2011-09-27 18:36:16  2   3 
10 2011-09-27 18:36:35  2   4 

순위 1의 최소 시간처럼해야입니다 18시 36분 15초 감안할 기반 그룹에 있어야합니다 등등.

동일한 테이블에 GroupRank를 원합니다. 그래서 dense_Rank() Over 절을 가진 것이 될 것입니다. 누구든지 SQL에서 쿼리를 작성하는 데 도움을 줄 수 있습니다.

답변

0

두 단계로 수행해야합니다. 첫 번째 단계는 각 레코드를 각 10 초 그룹으로 분리하는 것입니다. 각 레코드를 각 순위의 최소 시간과 10 초로 나누어 반올림 한 다음 반올림합니다 가장 가까운 정수로.

SELECT *, 
     SecondGroup = FLOOR(DATEDIFF(SECOND, 
            MIN([DateTime]) OVER(PARTITION BY [Rank]), 
            [DateTime])/10.0) 
FROM #T; 

주는 :

Id DateTime     Rank SecondGroup 
--------------------------------------------------- 
1 2011-09-27 18:36:15.000  1  0 
2 2011-09-27 18:36:15.000  1  0 
3 2011-09-27 18:36:19.000  1  0 
4 2011-09-27 18:36:23.000  1  0 
5 2011-09-27 18:36:26.000  1  1 
6 2011-09-27 18:36:30.000  1  1 
7 2011-09-27 18:36:32.000  1  1 
8 2011-09-27 18:36:14.000  2  0 
9 2011-09-27 18:36:16.000  2  0 
10 2011-09-27 18:36:35.000  2  2 

는 그런 다음 RankSecondGroup하여 DENSE_RANK 순서를 수행 할 수 있습니다 원하는 출력을 제공

SELECT Id, [DateTime], [Rank], 
     GroupRank = DENSE_RANK() OVER(ORDER BY [Rank], SecondGroup) 
FROM ( SELECT *, 
        SecondGroup = FLOOR(DATEDIFF(SECOND, 
               MIN([DateTime]) OVER(PARTITION BY [Rank]), 
               [DateTime])/10.0) 
      FROM #T 
     ) AS t; 

합니다.

샘플 데이터

CREATE TABLE #T (Id INT, [DateTime] DATETIME, [Rank] INT); 

INSERT #T (Id, [DateTime], [Rank]) 
VALUES 
    (1, '2011-09-27 18:36:15', 1), 
    (2, '2011-09-27 18:36:15', 1), 
    (3, '2011-09-27 18:36:19', 1), 
    (4, '2011-09-27 18:36:23', 1), 
    (5, '2011-09-27 18:36:26', 1), 
    (6, '2011-09-27 18:36:30', 1), 
    (7, '2011-09-27 18:36:32', 1), 
    (8, '2011-09-27 18:36:14', 2), 
    (9, '2011-09-27 18:36:16', 2), 
    (10, '2011-09-27 18:36:35', 2);