0

我有一个问题,我需要查询一个数据库,其中包含过去 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
4

1 回答 1

0

试一试 - 您可以使用公用表表达式使用 EOMONTH(DateField) 附加每个 DateField 值的月结束日期,然后在 GROUP BY 中使用它,以及具有相同 EOMONTH 值的所有 GrossExposure 值的平均值对于每个乐器。

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
于 2019-03-15T18:35:53.177 回答