【问题标题】:SSMS: How to return only the value in the last row for each month/year instead of every row?SSMS:如何仅返回每个月/年的最后一行中的值而不是每一行?
【发布时间】:2020-05-23 02:04:24
【问题描述】:

我正在使用的代码返回月/年内的所有日期,但我只希望它返回最后一个日期行而不是所有每日行。

这是我正在使用的代码。

;WITH OIL_INDEX AS (
    SELECT PRODUCT_SYMBOL
    ,CONTRACT_MONTH
    ,CONTRACT_YEAR
    ,CONTRACT_DETAIL
    ,TRADEDATE
    ,SETTLE
    ,AVG(SETTLE) OVER (
            PARTITION BY CONTRACT_DETAIL, YEAR(TRADEDATE), MONTH(TRADEDATE)
            ORDER BY TRADEDATE 
            ROWS BETWEEN 29 PRECEDING and CURRENT ROW
        ) AS MA30
    ,YEAR(TRADEDATE) AS TRADEYEAR
    ,MONTH(TRADEDATE) AS TRADEMONTH
    ,DAY(TRADEDATE) AS TRADEDAY
    ,row_number() OVER(
     PARTITION BY CONTRACT_DETAIL, TRADEDATE
      ORDER BY TRADEDATE DESC) AS RowNum
     FROM Pricing.dbo.MasterReport$

)

SELECT PRODUCT_SYMBOL
    ,CONTRACT_MONTH
    ,CONTRACT_YEAR
    ,CONTRACT_DETAIL
    ,TRADEDATE
    ,TRADEYEAR
    ,TRADEMONTH
    ,TRADEDAY
    ,SETTLE
    ,MA30
    FROM OIL_INDEX
    WHERE RowNum = 1 AND PRODUCT_SYMBOL
    IN ('CL','CY','WJ')
    ORDER BY PRODUCT_SYMBOL ASC, CONTRACT_DETAIL ASC,TRADEYEAR ASC, TRADEMONTH ASC, TRADEDAY ASC

这是给出的结果。

这就是我想要的。

【问题讨论】:

    标签: sql tsql ssms window-functions ssms-2012


    【解决方案1】:

    我觉得你只需要修改窗口函数的PARTITION BY子句:

    之前:

    ROW_NUMBER() OVER(
        PARTITION BY CONTRACT_DETAIL, TRADEDATE
        ORDER BY TRADEDATE DESC
    ) AS RowNum
    

    之后:

    ROW_NUMBER() OVER(
        PARTITION BY CONTRACT_DETAIL, YEAR(TRADEDATE), MONTH(TRADEDATE)
        ORDER BY TRADEDATE DESC
    ) AS RowNum
    

    基本原理:您的分区子句为每个不同的 (CONTRACT_DETAIL, TRADEDATE ) 元组创建一个新组;这是 liley 生成很多组,每个组可能只有一条记录。相反,您希望按合约和月份进行分区,然后按每个组中的交易日期对记录进行排名。

    【讨论】:

    猜你喜欢
    • 2011-08-17
    • 2023-02-08
    • 2023-03-17
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多