문제

MySQL 데이터베이스에 저장된 Netflow 데이터를 그래프로 만들려고 할 예정이며 관련 데이터 포인트를 얻는 효율적인 방법이 필요합니다. 그것들은 레코드가 날짜와 함께 intoch 이후 몇 초 동안 int로 저장됩니다. 나는 다음과 같은 것을 할 수 있기를 원합니다.

Select SUM(bytes) from table where stime > x and stime < Y  
group by (10 second intervals)

어쨌든 이것을 할 수 있습니까? 아니면 파이썬에서 로컬로 처리하는 것이 더 빠르겠습니까? 500K 행 테이블조차?

편집하다내 실수, 시간은 int 대신 서명되지 않은 이중으로 저장됩니다. 현재 사용 중입니다 GROUP BY (FLOOR(stime / I)) 여기서 나는 원하는 간격입니다.

도움이 되었습니까?

해결책 5

답변과 동료의 제안을 사용했습니다. 최종 결과는 다음과 같습니다.

Select FROM_UNIXTIME(stime), bytes 
from argusTable_2009_10_22 
where stime > (UNIX_TIMESTAMP()-600)
group by floor(stime /10)

반올림 솔루션도 시도했지만 결과는 일관되지 않았습니다.

가능성

다른 팁

정수 부서를 사용 하여이 작업을 수행 할 수 있습니다. 성능을 확실하지 않습니다.

몇 초 만에 원하는 간격이되도록하겠습니다.

SELECT SUM(bytes), ((stime - X) DIV I) as interval
FROM table
WHERE (stime > X) and (stime < Y)
GROUP BY interval

Example, let X = 1500 and I = 10
stime = 1503 -> (1503 - 1500) DIV 10 = 0 
stime = 1507 -> (1507 - 1500) DIV 10 = 0
stime = 1514 -> (1514 - 1500) DIV 10 = 1
stime = 1523 -> (1523 - 1500) DIV 10 = 2

다음을 시도해 보셨습니까? Tyiem 열을 10까지 데리고 결과를 반올림합니다.

SELECT    SUM(bytes) 
FROM      table 
WHERE     stime > x 
AND       stime < Y
GROUP BY  ROUND(stime/10, -1)

나는 Round () 함수를 모르고 mySQL에서 작동하는 함수 호출로 그룹화하는 것을 알지 못합니다. 위의 것은 t-sql입니다.

FLOOR 그룹에서 때때로 실패합니다. 예를 들어 값을 3으로 나눌 때 예를 들어 하나의 값으로 다른 시간을 그룹화하지만 4로 나눌 때 동일하지는 않지만이 두 값의 차이는 3 또는 4보다 훨씬 큽니다. 두 그룹. 다음과 같이 작동하는 바닥에 서명되지 않은 채로 캐스트하는 것이 좋습니다.

CAST(FLOOR(UNIX_TIMESTAMP(time_field)/I) AS UNSIGNED INT)

문제 :

때때로 GROUP BY FLOOR(UNIX_TIMESTAMP(time_field)/3) 에 비해 그룹을 적게 제공합니다 GROUP BY FLOOR(UNIX_TIMESTAMP(time_field)/4) 수학적으로 가능하지 않아야합니다.

SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(10)) as intervals,SUM(bytes) 
FROM table
WHERE where stime > x and stime < Y
group by intervals

몇 시간 전에이 작업을 수행 했으므로 기능을 만들었습니다 (SQL Server를 사용하면 거의 동일하다고 생각합니다).

먼저 간격과 날짜 부분 (분, 시간, 일, 나방, 연도)에 따라 날짜의 ID를 반환하는 스칼라 함수를 만들었습니다.

CREATE FUNCTION [dbo].[GetIDDate]
(
    @date datetime,
    @part nvarchar(10),
    @intervalle int
)
RETURNS int
AS
BEGIN
    -- Declare the return variable here
    DECLARE @res int
    DECLARE @date_base datetime
    SET @date_base = convert(datetime,'01/01/1970',103)

    set @res = case @part 
                WHEN 'minute' THEN datediff(minute,@date_base,@date)/@intervalle
                WHEN 'hour' THEN datediff(hour,@date_base,@date)/@intervalle
                WHEN 'day' THEN datediff(day,@date_base,@date)/@intervalle
                WHEN 'month' THEN datediff(month,@date_base,@date)/@intervalle
                WHEN 'year' THEN datediff(year,@date_base,@date)/@intervalle
                ELSE datediff(minute,@date_base,@date)/@intervalle END



    -- Return the result of the function
    RETURN @res

END

그런 다음 날짜 범위를 바탕으로 모든 ID를 반환하는 테이블 함수를 만들었습니다.

CREATE FUNCTION [dbo].[GetTableDate] 
(   
    -- Add the parameters for the function here
    @start_date datetime, 
    @end_date datetime,
    @interval int,
    @unite varchar(10)
)
RETURNS @res TABLE (StartDate datetime,TxtStartDate nvarchar(50),EndDate datetime,TxtEndDate nvarchar(50),IdDate int)
AS
begin
    declare @current_date datetime 
    declare @end_date_courante datetime
    declare @txt_start_date nvarchar(50)
    declare @txt_end_date nvarchar(50)
    set @current_date = case @unite 
                WHEN 'minute' THEN dateadd(minute, datediff(minute,0,@start_date),0)
                WHEN 'hour' THEN dateadd(hour, datediff(hour,0,@start_date),0)
                WHEN 'day' THEN dateadd(day, datediff(day,0,@start_date),0)
                WHEN 'month' THEN dateadd(month, datediff(month,0,@start_date),0)
                WHEN 'year' THEN dateadd(year, datediff(year,0,dateadd(year,@interval,@start_date)),0)
                ELSE dateadd(minute, datediff(minute,0,@start_date),0) END

    while @current_date < @end_date
    begin
        set @end_date_courante = 
            case @unite 
                WHEN 'minute' THEN dateadd(minute, datediff(minute,0,dateadd(minute,@interval,@current_date)),0)
                WHEN 'hour' THEN dateadd(hour, datediff(hour,0,dateadd(hour,@interval,@current_date)),0)
                WHEN 'day' THEN dateadd(day, datediff(day,0,dateadd(day,@interval,@current_date)),0)
                WHEN 'month' THEN dateadd(month, datediff(month,0,dateadd(month,@interval,@current_date)),0)
                WHEN 'year' THEN dateadd(year, datediff(year,0,dateadd(year,@interval,@current_date)),0)
                ELSE dateadd(minute, datediff(minute,0,dateadd(minute,@interval,@current_date)),0) END
        SET @txt_start_date = case @unite 
                WHEN 'minute' THEN CONVERT(VARCHAR(20), @current_date, 100)
                WHEN 'hour' THEN CONVERT(VARCHAR(20), @current_date, 100)
                WHEN 'day' THEN REPLACE(CONVERT(VARCHAR(11), @current_date, 106), ' ', '-')
                WHEN 'month' THEN REPLACE(RIGHT(CONVERT(VARCHAR(11), @current_date, 106), 8), ' ', '-')
                WHEN 'year' THEN CONVERT(VARCHAR(20), datepart(year,@current_date))
                ELSE CONVERT(VARCHAR(20), @current_date, 100) END
        SET @txt_end_date = case @unite 
                WHEN 'minute' THEN CONVERT(VARCHAR(20), @end_date_courante, 100)
                WHEN 'hour' THEN CONVERT(VARCHAR(20), @end_date_courante, 100)
                WHEN 'day' THEN REPLACE(CONVERT(VARCHAR(11), @end_date_courante, 106), ' ', '-')
                WHEN 'month' THEN REPLACE(RIGHT(CONVERT(VARCHAR(11), @end_date_courante, 106), 8), ' ', '-')
                WHEN 'year' THEN CONVERT(VARCHAR(20), datepart(year,@end_date_courante))
                ELSE CONVERT(VARCHAR(20), @end_date_courante, 100) END
        INSERT INTO @res (
StartDate,
EndDate,
TxtStartDate,
TxtEndDate,
IdDate) values(
@current_date,
@end_date_courante,
@txt_start_date,
@txt_end_date,
dbo.GetIDDate(@current_date,@unite,@interval)
)
        set @current_date = @end_date_courante

    end
    return
end

따라서 33 분의 각 간격에 대해 추가 된 모든 사용자를 계산하려면 다음과 같습니다.

SELECT count(id_user) , timeTable.StartDate
FROM user
INNER JOIn dbo.[GetTableDate]('1970-01-01',datedate(),33,'minute') as timeTable
ON dbo.getIDDate(user.creation_date,'minute',33) = timeTable.IDDate

dbo.getIddate에 의해 그룹화

:)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top