Как выбрать самую последнюю запись из группы записей с одинаковыми датой и временем? - PullRequest
0 голосов
/ 27 мая 2019

Итак, у меня есть несколько записей, которые я пытаюсь отобразить на графике.В настоящее время, если некоторые записи имеют одно и то же время и дату, они группируются на графике, что является тем, что я хочу, но график показывает сумму этих записей вместо последней записи, но я просто не уверен, как этого добиться.

SUM(TAB.Amount) OVER(PARTITION BY TAB.AccountID order by TAB.AccountID, TransactionValueDate, StatementNumber, SequenceNumber, TAB.RecordID) AS [IntraDayBalance]

Это код, который я использую для получения этих записей, который отлично работает в таблице, но я не могу использовать это на графике, как будто я сказал, что он суммирует записи.Так что будет ли способ взять последнюю запись из этого столбца, которая имеет ту же дату и время.

Не уверен, как отформатировать это, но это пример.Допустим, у меня есть 3 записи (532255.20, 2199722.65 и 1995722.65), которые имеют одинаковую дату и время (16/04/2019 06:41:04).В настоящее время в этой точке даты и времени график показывает мне суммарную цифру этих записей (4727700.50), но на самом деле я хочу, чтобы это была последняя запись (1995722.65).

Что я спрашиваю, так это какя бы отобразил эту последнюю запись вместо суммы суммы.Имейте в виду, что я не могу изменить строку кода, показанную выше, так как она отлично работает для оригинального использования, но не для графика, поэтому для графика понадобится еще одна строка, я просто не знаю, как это сделать самому.Любая помощь будет высоко ценится!

РЕДАКТИРОВАТЬ: Спасибо за вашу помощь.Сейчас я чувствую себя идиотом, но просто не могу включить ни одно из этих утверждений в свой код.Я все еще новичок в T-SQL и все еще учусь правильно форматировать код и куда идти, но это мое утверждение SELECT, любые советы о том, как включить любое из этих утверждений в этот код, были бы очень полезны!

        ,TAB.AccountID
        ,TAB.Amount
        ,AC.ShortName
        ,FX.FXRate
        ,FX.IsDivide
        ,CASE 
            WHEN FXRate IS NOT NULL AND FXRate <> 0 THEN
                CASE
                    WHEN FX.IsDivide = 0 THEN
                        ROUND(TAB.Amount / FXRate,2)
                    ELSE
                        ROUND(TAB.Amount * FXRate,2)
                END
            ELSE
                0
        END AS BalanceUSD
        ,ITS.LimitAmount
        ,ITS.FloorAmount
        ,CR.SwiftCode AS Ccy
        ,TAB.RecordType
        ,AC.AccountNumber
        ,AC.BankFileIdentifier AS Accountidentifier
        ,DV.ShortName AS Division
        ,CP.ShortName AS Counterparty
        ,TAB.Amount
        ,SUM(TAB.Amount) OVER(PARTITION BY TAB.AccountID  order by TAB.AccountID, TransactionValueDate, StatementNumber, SequenceNumber, TAB.RecordID) AS [IntraDayBalance]
        ,CAST(29218 + TransactionValueDate AS DATETIME) AS TransactionValueDate
        ,CAST(29218 + TransactionEntryDate AS DATETIME) AS TransactionEntryDate
        ,CASE
            WHEN TransactionFlow = 0 THEN
                TransactionAmount
            ELSE
                -TransactionAmount
        END AS TransactionAmount
        ,CASE 
            WHEN ITS.TransactionFlow = 0 THEN
                ITS.TransactionAmount
            ELSE
                0
        END AS Inflow
        ,CASE 
            WHEN ITS.TransactionFlow = 1 THEN
                ITS.TransactionAmount
            ELSE
                0
        END AS Outflow
        ,TransactionFlow
        ,TransactionCode
        ,CustomerReference
        ,BankReference
        ,Right(RTRIM('0000000000' + CAST(StatementNumber AS CHAR (20))), 10) AS StatementNumber
        ,RTRIM(CAST(ITS.SequenceNumber AS CHAR (20))) AS SequenceNumber
        ,CAST(29218 + StatementDate AS DATETIME) AS StatementDate
        --,DATEADD(SECOND,ImportedByTime,CAST(29218 + StatementDate AS DATETIME))  AS StatementDateTime
        ,CASE
            WHEN TAB.RecordType = 'B' THEN
                @StartDate
            ELSE
                DATEADD(SECOND,ImportedByTime,CAST(29218 + StatementDate AS DATETIME))  
        END AS StatementDateTime
        ,InformationToAccountOwner
        ,Information1
        ,Information2
        ,Information3
        ,Information4
        ,Information5
        ,Information6
        ,ImportedBy
        ,CAST(29218 + ImportedByDate AS DATETIME) AS ImportedByDate
        ,CASE
            WHEN TAB.RecordType = 'B' THEN
                @StartDate
            ELSE
                DATEADD(SECOND,ImportedByTime,CAST(29218 + ImportedByDate AS DATETIME))  
        END AS ImportDateTime
        ,@StartDate AS StartDate
        ,@EndDate AS EndDate
        ,ITS.DebitAmount
        ,ITS.CreditAmount
        ,ITS.FloorAmount
        ,ITS.LimitAmount
        ,ITS.RecordID


FROM CTE_TransactionsAndBalances AS TAB

LEFT OUTER JOIN
    InterimTransactionStatement AS ITS ON TAB.RecordID = ITS.RecordID

LEFT OUTER JOIN
    Accounts AS AC ON TAB.AccountID = AC.ACRecordID

LEFT OUTER JOIN
    Currencies AS CR ON AC.CurrencyID = CR.CRRecordID

LEFT OUTER JOIN
    Divisions AS DV ON AC.DivisionID = DV.DVRecordID

LEFT OUTER JOIN
    Counterparties AS CP ON AC.CounterpartyID = CP.CPRecordID

LEFT OUTER JOIN
    @tbl_FXRates AS FX ON AC.CurrencyID = FX.FromCcyID
    AND FXRateDateN >= FX.StartDateN
    AND FXRateDateN <= FX.EndDateN
    AND FX.ToCcyID = @ReportingCcyID

--WHERE AC.ACRecordID = 94
 order by TAB.AccountID, TransactionValueDate, StatementNumber, SequenceNumber, TAB.RecordID ```

1 Ответ

0 голосов
/ 27 мая 2019

использовать подзапрос и row_numberr()

select * from ( select
SUM(TAB.Amount) OVER(PARTITION BY TAB.AccountID  order by TAB.AccountID, TransactionValueDate, StatementNumber, SequenceNumber, TAB.RecordID) AS [IntraDayBalance],
row_number() over(partition by TAB.AccountID order by TransactionValueDate desc) rn
from table
) a where a.rn=1
...