如何根据月末日期在数据库中选择值?

时间:2019-03-15 17:29:37

标签: sql sql-server date moving-average dayofmonth

我遇到一个问题,我需要查询一个包含过去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 :(得分:0)

尝试一下-您可以使用公用表表达式使用EOMONTH(DateField)附加每个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