복붙노트

[SQL] 어떻게 그룹 시간 시간으로 10 분

SQL

어떻게 그룹 시간 시간으로 10 분

내가 할 때와 같은

SELECT [Date]
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY [Date]

어떻게 그룹 기간을 지정할 수 있습니까?

MS SQL 2008

2 [편집]

노력하고있어

SELECT MIN([Date]) AS RecT, AVG(Value)
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY (DATEPART(MINUTE, [Date]) / 10)
  ORDER BY RecT

변경된 10 % 10 /로는 밀리 일없이 출력 할 수있다?

해결법

  1. ==============================

    1.마지막으로 수행

    마지막으로 수행

    GROUP BY
    DATEPART(YEAR, DT.[Date]),
    DATEPART(MONTH, DT.[Date]),
    DATEPART(DAY, DT.[Date]),
    DATEPART(HOUR, DT.[Date]),
    (DATEPART(MINUTE, DT.[Date]) / 10)
    
  2. ==============================

    2.나는 슈퍼 파티에 늦게 해요,하지만 이것은 기존의 답변에 표시되지 않습니다

    나는 슈퍼 파티에 늦게 해요,하지만 이것은 기존의 답변에 표시되지 않습니다

    GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
    
    SELECT   DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
                                                                   AS [date_truncated],
             COUNT(*) AS [records_in_interval],
             AVG(aa.[value]) AS [average_value]
    FROM     [friib].[dbo].[archive_analog] AS aa
    GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
    ORDER BY [date_truncated]
    

    데이터 스팬 세기, ddagger하는 경우; 에 대해 하나의 앵커 날짜를 사용하여 2 ~ 또는 밀리 초 그룹 여전히 오버 플로우가 발생합니다. 즉 일어나는 경우에, 당신은 자신의 날짜의 자정 비닝 비교를 고정하기 위해 각 행을 요청할 수 있습니다 :

    당신의 DATEPART가 SECOND 경우 † 232 ≈ 4.29E + 9, 그래서, 당신은 양쪽에 4,300,000,000초를 얻을, 또는 "앵커 ± 136년." 마찬가지로, 232 밀리 초 ≈ 49.7 일이다. 및 ddagger; 경우 실제로 스팬 세기 나 천년 여전히 초 또는 밀리 초 ... 축하에 대한 정확한 데이터를! 무엇이든 당신이하고있는, 그 일을 계속.

  3. ==============================

    3.당신이 할 수있는 T-SQL에서 :

    당신이 할 수있는 T-SQL에서 :

    SELECT [Date]
      FROM [FRIIB].[dbo].[ArchiveAnalog]
      GROUP BY [Date], DATEPART(hh, [Date])
    

    또는

    분 사용하여 DATEPART (MI [일자])

    또는

    10 분 DATEPART (MI [일자]) / 10 (티모 제안처럼) 사용

  4. ==============================

    4.10 분 간격, 당신은 것

    10 분 간격, 당신은 것

    GROUP BY (DATEPART(MINUTE, [Date]) / 10)
    

    이미 tzup 및 Pieter888 언급 한 것처럼 ... 그냥 시간 간격을 수행하는

    GROUP BY DATEPART(HOUR, [Date])
    
  5. ==============================

    5.같은 뭔가해야

    같은 뭔가해야

    select timeslot, count(*)  
    from 
        (
        select datepart('hh', date) timeslot
        FROM [FRIIB].[dbo].[ArchiveAnalog]  
        ) 
    group by timeslot
    

    (100 % 확실 구문에 대해 - 좀 더 오라클 종류의 사람이야)

    오라클의 경우 :

    SELECT timeslot, COUNT(*) 
    FROM
    (  
        SELECT to_char(l_time, 'YYYY-MM-DD hh24') timeslot 
        FROM
        (
            SELECT l_time FROM mytab  
        )  
    ) GROUP BY timeslot 
    
  6. ==============================

    6.원래의 대답은 저자가 꽤 잘 작동했다. 그냥 이런 생각을 확장, 당신은 뭔가를 할 수 있습니다

    원래의 대답은 저자가 꽤 잘 작동했다. 그냥 이런 생각을 확장, 당신은 뭔가를 할 수 있습니다

    group by datediff(minute, 0, [Date])/10
    

    이는 다음 60 분 등 반나절 인 (720) 말을 더 긴 기간으로 그룹화 할 수 있습니다

  7. ==============================

    7.MySQL 용 :

    MySQL 용 :

    GROUP BY
    DATE(`your_date_field`),
    HOUR(`your_date_field`),
    FLOOR( MINUTE(`your_date_field`) / 10);
    
  8. ==============================

    8.

    declare @interval tinyint
    set @interval = 30
    select dateadd(minute,(datediff(minute,0,[DateInsert])/@interval)*@interval,0), sum(Value_Transaction)
    from Transactions
    group by dateadd(minute,(datediff(minute,0,[DateInsert])/@interval)*@interval,0)
    
  9. ==============================

    9.내 솔루션은 날짜 간격으로 테이블을 생성하는 함수를 사용하고 난 테이블의 날짜 간격을 사용하여 그룹에 원하는 데이터를이 테이블에 가입하는 것입니다. 데이터를 제시 할 때 날짜 간격이어서, 쉽게 선택 될 수있다.

    내 솔루션은 날짜 간격으로 테이블을 생성하는 함수를 사용하고 난 테이블의 날짜 간격을 사용하여 그룹에 원하는 데이터를이 테이블에 가입하는 것입니다. 데이터를 제시 할 때 날짜 간격이어서, 쉽게 선택 될 수있다.

    CREATE FUNCTION [dbo].[fn_MinuteIntervals]
        (
          @startDate SMALLDATETIME ,
          @endDate SMALLDATETIME ,
          @interval INT = 1
        )
    RETURNS @returnDates TABLE
        (
          [date] SMALLDATETIME PRIMARY KEY NOT NULL
        )
    AS
        BEGIN
            DECLARE @counter SMALLDATETIME
            SET @counter = @startDate
            WHILE @counter <= @endDate
                BEGIN
                    INSERT INTO @returnDates VALUES ( @counter )
                    SET @counter = DATEADD(n, @interval, @counter)
                END
            RETURN
        END
    
  10. ==============================

    10.SQL 서버 2012, 저는 믿습니다하지만 그것은 SQL 서버 2008R2에서 일하는 것, 내가 밀리 초까지 타임 슬라이싱을 얻기 위해 다음과 같은 방법을 사용 :

    SQL 서버 2012, 저는 믿습니다하지만 그것은 SQL 서버 2008R2에서 일하는 것, 내가 밀리 초까지 타임 슬라이싱을 얻기 위해 다음과 같은 방법을 사용 :

    DATEADD(MILLISECOND, -DATEDIFF(MILLISECOND, CAST(time AS DATE), time) % @msPerSlice, time)
    

    이 방식으로 작동합니다 :

    불행하게도, 같은 마이크로와 작은 단위, 그래서 더 큰, 더 정밀한 데이터 세트가 덜 편리한 고정 지점을 사용해야합니다이 오버 플로우입니다.

    나는 엄격하게이 문제를 벤치마킹하지 않은 마일리지는 다를 수 있습니다, 그래서 나는, 빅 데이터에 아니지만, 성능의 장비와 데이터 세트에 시도 다른 방법에 비해 눈에 띄게 악화하지 않았다, 임의의 슬라이스에 대한 개발자의 편의에 지불금은 보람 우리를 위해.

  11. ==============================

    11.

    select from_unixtime( 600 * ( unix_timestamp( [Date] ) % 600 ) ) AS RecT, avg(Value)
    from [FRIIB].[dbo].[ArchiveAnalog]
    group by RecT
    order by RecT;
    

    당신이 그룹에 (초)의 수에 의해 두 (600)를 교체합니다.

    자주이 필요하고 테이블이 변경되지 않으면, 아카이브가 제시 이름으로, 아마 조금 더 빠르게 변환 할 수 있으며 테이블의 unixtime 같은 날짜 (시간)을 저장한다.

  12. ==============================

    12.나는이 하나 쇼에 늦게 나는 알고 있지만, 나는이 사용 - 매우 간단한 방법입니다. 이것은 당신이 어떤 반올림 문제없이 60 개 분이 조각을 얻을 수 있습니다.

    나는이 하나 쇼에 늦게 나는 알고 있지만, 나는이 사용 - 매우 간단한 방법입니다. 이것은 당신이 어떤 반올림 문제없이 60 개 분이 조각을 얻을 수 있습니다.

    Select 
       CONCAT( 
                Format(endtime,'yyyy-MM-dd_HH:'),  
                LEFT(Format(endtime,'mm'),1),
                '0' 
              ) as [Time-Slice]
    
  13. from https://stackoverflow.com/questions/5002661/how-to-group-time-by-hour-or-by-10-minutes by cc-by-sa and MIT license