0

ログに記録されたアクションの対象となった時点での各アカウントのステータスを追加するために、SQL Server 2012 を使用して2 つのログ テーブルを結合しようとしています。

最初の表は、要求日( request_date) と要求の受信者( )に基づいて、Web サイトのユーザー (他のユーザー) からの連絡要求のログから作成されたレポートですreceiver_account_id。連絡要求が承認されると、承認日( approval_date) 列も入力されます。この表は次のようになります。

    receiver_account_id    sender_account_id    request_date    approval_date
    13                     19                   2012-08-10      2012-09-01
    13                     21                   2013-05-15      NULL
    17                     19                   2011-09-11      NULL
    25                     44                   2012-11-05      2012-11-07

2 番目のテーブルは、基本的にアカウントのステータス変更を記録します。

    date        account_id        status
    2011-07-10  13                free
    2012-08-15  13                premium
    2010-12-10  17                free
    2012-05-05  17                premium
    2010-01-20  25                free
    2011-04-10  25                premium
    2012-11-06  25                free

これら 2 つのテーブルを結合したいので、次のようなものを取得できます。

    receiver_account_id    sender_account_id    request_date    approval_date    receiver_status_when_received    receiver_status_when_approved
    13                     19                   2012-08-10      2012-09-01       free                             premium  
    13                     21                   2013-05-15      NULL             premium                          NULL
    17                     19                   2011-09-11      NULL             free                             NULL
    25                     44                   2012-11-05      2012-11-07       premium                          free

送信者のステータスはまったく重要ではありません。

4

1 に答える 1

0

これを試して

;WITH StatusPeriods AS
(
    SELECT account_id, [Status], [date] AS StatusStart, 
        ISNULL((SELECT MIN(Date) FROM status_log nxt WHERE nxt.date > sl.Date AND nxt.account_id = sl.account_id), '2100-1-1') AS StatusEnd
    FROM status_log sl
) 
SELECT request.*, 
    StatusWhenReceived.[Status] AS  receiver_status_when_received, StatusWhenApproved.[Status] AS receiver_status_when_approved
FROM requests 
INNER JOIN  StatusPeriods StatusWhenReceived 
    ON StatusWhenReceived.receiver_account_id = requests.account_id AND requests.request_date between StatusWhenReceived.StatusStart AND StatusWhenReceived.StatusEnd
LEFT  JOIN  StatusPeriods StatusWhenApproved 
    ON StatusWhenApproved.receiver_account_id = requests.account_id AND requests.approval_date between StatusWhenApproved.StatusStart AND StatusWhenApproved.StatusEnd
于 2013-08-07T15:09:19.013 に答える