SQL Server / T-SQL: выбор определенного интервала (по группам) - PullRequest
1 голос
/ 18 октября 2011

Я хочу написать выбор, который агрегирует по данным (которые имеют столбец DATETIME в качестве идентификатора) с теоретически возможным ЛЮБЫМ интервалом (например, 1 час, 1 час и 22 секунды, 1 год и 3 минуты и т. Д.).

Этот выбор должен быть в состоянии агрегировать за 1 час, 12 минут, 14 секунд и должен возвращать 3 строки

SELECT  DATEPART(YEAR,id) as year, 
        DATEPART(MONTH,id) as month,
        DATEPART(DAY,id) as day,
        DATEPART(HOUR,id) as hour,
        DATEPART(MINUTE,id) as minute,
        AVG([Open]),
        AVG([Close]),
        AVG([Min]),
        AVG([Max])
FROM QuoteHistory
where id between '2000-02-06 17:00:00.000' and '2000-02-06 20:36:42.000'
GROUP BY 
    DATEPART(YEAR,id), 
    DATEPART(MONTH,id),
    DATEPART(DAY,id),
    DATEPART(HOUR,id),
    DATEPART(MINUTE,id)
ORDER BY 1,2,3,4,5;

Я застрял здесь и не могу разобраться с этой проблемой. Для "простых интервалов"как" 30 минут "я мог бы просто добавить по модулю

DATEPART(MINUTE,id)%2

, но когда интервал" затрагивает "более 1 части даты, я застрял.

Любая помощь приветствуется, спасибо!

1 Ответ

0 голосов
/ 18 октября 2011

Предполагая некоторые параметры здесь:

;WITH Date_Ranges AS (
    SELECT
        @min_datetime AS start_datetime,
        DATEADD(SECOND, @seconds,
            DATEADD(MINUTE, @minutes,
            DATEADD(HOUR, @hours,
            DATEADD(DAY, @days,
            DATEADD(WEEK, @weeks,
            DATEADD(MONTH, @months,
            DATEADD(YEAR, @years, @min_datetime))))))) AS end_datetime
    UNION ALL
    SELECT
        DATEADD(SECOND, 1, end_datetime),
        DATEADD(SECOND, @seconds,
            DATEADD(MINUTE, @minutes,
            DATEADD(HOUR, @hours,
            DATEADD(DAY, @days,
            DATEADD(WEEK, @weeks,
            DATEADD(MONTH, @months,
            DATEADD(YEAR, @years, end_datetime)))))))
    FROM
        Date_Ranges
    WHERE
        DATEADD(SECOND, 1, end_datetime) < @max_datetime
)
SELECT
    DR.min_datetime,
    DR.max_datetime,
    AVG([Open]),
    AVG([Close]),
    AVG([Min]),
    AVG([Max])
FROM
    Date_Ranges DR
LEFT OUTER JOIN Quote_History QH ON
    QH.id BETWEEN DR.min_datetime AND DR.max_datetime
GROUP BY
    DR.min_datetime,
    DR.max_datetime
ORDER BY
    DR.min_datetime,
    DR.max_datetime

Возможно, вам придется поработать над тем, как обрабатывать крайние случаи (этот диапазон в 1 секунду между диапазонами дат может быть проблемой в зависимости от ваших данных). Надеюсь, это должно направить вас в правильном направлении.

...