سؤال

وانا ذاهب الى أن تكون بيانية netflow البيانات المخزنة في قاعدة بيانات MySQL و أريد طريقة فعالة للحصول على نقاط البيانات ذات الصلة.أنها يتم تخزين السجلات مع التاريخ باعتباره الباحث لفترة ثانية منذ الحقبة.وأود أن تكون قادرة على شيء من هذا القبيل:

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

هل حاولت التالية ؟ فقط devide tyiem عمود من 10 و جولة النتيجة إلى أسفل.

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

أنا لا أعرف الطقس الدالة ROUND() و تجمع مع وظيفة المكالمات يعمل في الخلية على الرغم من أعلاه 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 ولكن أفترض انها تقريبا نفس) :

أولا أنا خلقت العددية الدالة التي ترجع لي معرف موعد اعتمادا على فاصل التاريخ جزء (دقيقة,ساعة,يوم,فراشة,السنة):

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

ثم أنشأت جدول الدالة التي ترجع لي كل معرف betweend نطاق التاريخ :

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(المستخدم.creation_date,'دقيقة' ، 33) الترتيب حسب الجدول الزمني.StartDate

:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top