Как выделить значения в базе данных на основе даты на конец месяца? - PullRequest
0 голосов
/ 15 марта 2019

У меня есть проблема, когда мне нужно запросить базу данных, которая включает в себя несколько строк торговой активности за последние 90 дней. В настоящее время запрос строится для определения средней суммы за 90-дневный период - поэтому каждый день имеет одно значение воздействия, и запрос помогает нам определить среднее значение за 90 дней, просто суммируя ежедневные значения, а затем делив на 90. делает это по мере продвижения даты, поэтому значение обновляется каждый день, когда выполняется запрос.

Вышеуказанное достаточно просто для выполнения, но теперь мне нужно определить средние суммы на конец месяца за последние 3 месяца. Я выяснил, как получить только даты окончания месяца, но не уверен, как объединить это с текущим запросом. Кроме того, необходимо иметь возможность самостоятельно обновляться.

/* Test query below */ 

DECLARE @Date DATETIME = Getdate() 
DECLARE @daycount INT = 90
DECLARE @startDate DATETIME = Dateadd(dd, @daycount*-1, @Date)  

SELECT sub.Instrument, 
       ( Sum(sub.GrossExposure) / @daycount )    AS AvgGrossExposure
FROM   (SELECT DateField, 
               Instrument, 
               GrossExposure  
        FROM   table 
        WHERE  DateField <= @Date 
           AND Datefield >= @startDate 
        ) sub 
GROUP  BY Instrument

Чтобы рассчитать конец месяца за последние 90 дней, я возился с этим, но он также включает сегодняшнюю дату, и в этом случае мне не нужно это значение.

/* Test query for month-end dates, past 90 days */
DECLARE @Date DATETIME = GetDate()
DECLARE @daycount INT = 90
DECLARE @startDate DATETIME = Dateadd(dd, @daycount*-1, @Date) 

SELECT          max(datefield) AS month_ends
                FROM            table
                WHERE datefield <= @Date 
                AND datefield >= @startDate 
                GROUP BY        month(datefield), 
                                year(datefield)
                ORDER BY month_ends

1 Ответ

0 голосов
/ 15 марта 2019

Попробуйте - вы можете использовать общее табличное выражение для добавления даты окончания месяца к каждому значению DateField с помощью EOMONTH (DateField), а затем использовать ее в вашем GROUP BY со средним значением всех значений GrossExposure, которые имеютодинаковое значение EOMONTH для каждого инструмента.

WITH CTE AS (
    SELECT EOMONTH(DateField) AS EndOfMonthDate
        ,DateField
        ,Instrument
        ,GrossExposure
    FROM TABLE
    WHERE DateField BETWEEN GETDATE()-90 AND GETDATE()
)
SELECT CTE.Instrument,
    CTE.EndOfMonthDate,
    AVG(CTE.GrossExposure) AS AvgGrossExposure
FROM CTE
GROUP BY CTE.Instrument, CTE.EndOfMonthDate
...