sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2008のLead()およびLAG()機能

    テーブルをそれ自体に結合することで、正しい方向に進んでいます。ここではうまくいくはずの2つの方法を以下に示しました。最初のトリックはROW_NUMBERにあります 、必ずユーザーIDで分割し、日付で並べ替えてください。次に、INNER JOINのいずれかを使用できます 集計またはCROSS APPLYを使用 累計を作成します。

    パーティション化されたROW_NUMBER()を使用してデータを設定する :

    DECLARE @Data TABLE (
        RowNum INT,
        UserId INT,
        Date DATE,
        Miles INT
    )
    INSERT @Data 
        SELECT
            ROW_NUMBER() OVER (PARTITION BY UserId
                ORDER BY Date) AS RowNum,
            *
        FROM (
            SELECT 1, '2015-01-01', 5
            UNION ALL SELECT 1, '2015-01-02', 6
            UNION ALL SELECT 2, '2015-01-01', 7
            UNION ALL SELECT 2, '2015-01-02', 3
            UNION ALL SELECT 2, '2015-01-03', 2
            ) T (UserId, Date, Miles)
    

    INNER JOINを使用する 集約あり

    SELECT
        D1.UserId,
        D1.Date,
        D1.Miles,
        SUM(D2.Miles) AS [Total]
    FROM @Data D1
        INNER JOIN @Data D2
            ON D1.UserId = D2.UserId
                AND D2.RowNum <= D1.RowNum
    GROUP BY
        D1.UserId,
        D1.Date,
        D1.Miles
    

    CROSS APPLYを使用する 累計で

    SELECT
        UserId,
        Date,
        Miles,
        Total
    FROM @Data D1
        CROSS APPLY (
            SELECT SUM(Miles) AS Total
            FROM @Data
            WHERE UserId = D1.UserId
                AND RowNum <= D1.RowNum
        ) RunningTotal
    

    出力は各メソッドで同じです:

    UserId      Date       Miles       Total
    ----------- ---------- ----------- -----------
    1           2015-01-01 5           5
    1           2015-01-02 6           11
    2           2015-01-01 7           7
    2           2015-01-02 3           10
    2           2015-01-03 2           12
    



    1. SQL:カンマ区切りの文字列を解析し、結合として使用します

    2. カーソルオラクル内のforループ

    3. ローカルタイムゾーン値を含むOracleタイムスタンプ透過変換

    4. SQLについてもっと知りたい人のための10の役立つリソース