0

残高の履歴を履歴テーブルに保存するシステムがあります。テーブルには、口座番号、ソート コード、残高、残高開始日、残高終了日があります。残高が更新されると、残高、その残高が最初に開始された日付、および残高が変更された日付を示すエントリが履歴テーブルに作成されます。したがって、たとえば、テーブルには $100.00 の残高が表示され、この残高は 2013 年 7 月 10 日から 2013 年 7 月 15 日まで実行されます。

私がやろうとしているのは、特定の日のすべての並べ替えコードの残高の合計を取得することですが、この日に残高が変更されていない可能性があるため、最も近い前の日付を返す必要がありますが、失敗しています。

これは私がこれまでに試したことです。

declare @sdate datetime
set @sdate = '06/08/2012' --mm/dd/yyyy

SELECT CONVERT(varchar(20),MAX(StartDate),103) as "Closest Start Date",  Sort, SUM(Balance) AS "Sum of balances"
    FROM BalanceHistory
        WHERE StartDate <= convert(smalldatetime ,@sdate) AND SortCode <> 'ABC123456'
            GROUP BY SortCode

SELECT FROM BalanceHistory は次のようなものを生成します

AccountNumber, SortCode, Balance, StartDate, EndDate, RECID
00000001, srt010203, 100.00, 06/01/2013, 06/02/2013,  RECID
00000001, srt010203, 110.00, 06/02/2013, 06/03/2013,  RECID
00000001, srt010203, 120.00, 06/03/2013, 06/04/2013,  RECID
00000002, srt010204, 200.00, 06/01/2013, 06/02/2013,  RECID
00000003, srt010204, 300.00, 06/01/2013, 06/02/2013,  RECID
00000004, srt010205, 400.00, 06/01/2013, 06/02/2013,  RECID
00000005, srt010205, 500.00, 06/01/2013, 06/02/2013,  RECID
4

2 に答える 2

1

JOIN関数を使用することで、これを行うことができますROW_NUMBER()(SQL Server 2005 以降を想定)。

DECLARE @sdate DATE
SET @sdate = '2012-06-08'
SELECT SortCode, SUM(Balance)'Sum of Balances'
FROM (SELECT AccountNumber,SortCode, Balance,ROW_NUMBER() OVER (PARTITION BY AccountNumber ORDER BY StartDate DESC)'RowRank'
        FROM BalanceHistory
        WHERE StartDate <= @sdate AND SortCode <> 'ABC123456'
     )sub
WHERE RowRank = 1
GROUP BY SortCode

デモ: SQL フィドル

サブクエリのROW_NUMBER()関数は、各口座番号の残高に「RowRank」を割り当てます。StartDate DESC で並べ替えて、各口座番号の最新の残高のランク「1」を取得します。WHERE 基準により、日付からの最新の残高に制限されます。変数に設定します。次に、外側のクエリでそのランクを使用して、その 1 つの残高のみに制限します。

于 2013-07-16T16:21:37.830 に答える