2

The code I'm working from returns all dates within the month/year but I only want it to return the last date row instead of all daily rows.

Here is the code I'm working from.

;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

Here is the result this gives.

Sample result

Here is what I would like.

enter image description here

GMB
  • 216,147
  • 25
  • 84
  • 135
gwhb
  • 77
  • 6

1 Answers1

2

I think that you just need to modify the PARTITION BY clause of the window function:

Before:

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

After:

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

Rationale: your partitioning clause creates a new group for each distinct (CONTRACT_DETAIL, TRADEDATE ) tuple; this is liley to generate a lot of groups, with potentially just one record per group. Instead, you want to partition by contract and month, and then rank records by trade date in each group.

GMB
  • 216,147
  • 25
  • 84
  • 135
  • 1
    @gwhb - This is excellent advice :) Here are some links if you're not familiar with "window functions": https://www.red-gate.com/simple-talk/sql/t-sql-programming/introduction-to-t-sql-window-functions/, https://www.sqlservertutorial.net/sql-server-window-functions/sql-server-row_number-function/ – FoggyDay Feb 06 '20 at 23:33