SSMS: как вернуть только значение в последней строке для каждого месяца / года вместо каждой строки? - PullRequest
2 голосов
/ 07 февраля 2020

Код, из которого я работаю, возвращает все даты в течение месяца / года, но я хочу, чтобы он возвращал только последнюю строку даты вместо всех ежедневных строк.

Вот код, из которого я работаю .

;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

Вот результат, который это дает.

Sample result

Вот то, что я хотел бы.

enter image description here

1 Ответ

2 голосов
/ 07 февраля 2020

Я думаю, что вам просто нужно изменить предложение 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 ); Это очень важно для создания большого количества групп, по одной записи на группу. Вместо этого вы хотите разделить по контракту и month , а затем ранжировать записи по дате сделки в каждой группе.

...