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

SQL Server 2012 の Last_Value() 関数を使用するときに null 値を無視する

    おそらく PIVOT を追加しない限り、LAST_VALUE でそれを実行できるかどうかはわかりません。

    また、Size と Price は別の行にあるため、別々に扱う必要があります。したがって、これはあなたがそれを分解したいことを達成します.

    DECLARE @source TABLE (FldType int, DateCol DateTime, Price int, Size int);
    
    INSERT @source VALUES
        (2, '2012-08-22 00:02:01', 9140, 1048),(0, '2012-08-22 00:02:02', 9140, 77),
        (1, '2012-08-22 00:02:03', 9150, 281),(2, '2012-08-22 00:02:04', 9140, 1090),
        (0, '2012-08-22 00:02:05', 9150, 1),(1, '2012-08-22 00:02:06', 9150, 324),
        (2, '2012-08-22 00:02:07', 9140, 1063);
    
    
    SELECT
        S.DateCol, Xp0.Price0, Xs0.Size0, Xp1.Price1, Xs1.Size1, Xp2.Price2, Xs2.Size2
    FROM
        @source S
        OUTER APPLY
        (SELECT TOP 1 S0.Price AS Price0 FROM @source S0 WHERE S0.FldType = 0 AND S0.DateCol <= S.DateCol ORDER BY S0.DateCol DESC) Xp0
        OUTER APPLY
        (SELECT TOP 1 S1.Price AS Price1 FROM @source S1 WHERE S1.FldType = 1 AND S1.DateCol <= S.DateCol ORDER BY S1.DateCol DESC) Xp1
        OUTER APPLY
        (SELECT TOP 1 S2.Price AS Price2 FROM @source S2 WHERE S2.FldType = 2 AND S2.DateCol <= S.DateCol ORDER BY S2.DateCol DESC) Xp2
        OUTER APPLY
        (SELECT TOP 1 S0.Size AS Size0 FROM @source S0 WHERE S0.FldType = 0 AND S0.DateCol <= S.DateCol ORDER BY S0.DateCol DESC) Xs0
        OUTER APPLY
        (SELECT TOP 1 S1.Size AS Size1 FROM @source S1 WHERE S1.FldType = 1 AND S1.DateCol <= S.DateCol ORDER BY S1.DateCol DESC) Xs1
        OUTER APPLY
        (SELECT TOP 1 S2.Size AS Size2 FROM @source S2 WHERE S2.FldType = 2 AND S2.DateCol <= S.DateCol ORDER BY S2.DateCol DESC) Xs2
    ORDER BY
        DateCol;
    

    もう 1 つの方法は、トリガーまたは要約を行う ETL を介して別のテーブルを維持することです。




    1. すべてのレコードをカウントし、表示用に特定の数のみを取得(LIMIT)する方法は?

    2. Excelでのssisパッケージ形式

    3. EntityFramework5を使用してMySQLの自動インクリメントフィールドに特定のIDを挿入します

    4. フィールドpost_titleが別の行に重複している場合、テーブルの行を削除するにはどうすればよいですか?