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

SQL Server で LAG() および LEAD() 関数を使用するときに NULL 値を無視することは可能ですか?

    ウィンドウ関数を使用して可能です。この記事 詳細はItzik Ben-Ganによる。

    以下のコードでは、cte が最新の NOT NULL id 値を取得してから、次の select が実際の列値を取得します。この例では LAG.eg を使用しています。

    -- DDL for T1
    SET NOCOUNT ON;
    USE tempdb;
    IF OBJECT_ID(N'dbo.T1', N'U') IS NOT NULL DROP TABLE dbo.T1;
    GO
    CREATE TABLE dbo.T1
    (
    id INT NOT NULL CONSTRAINT PK_T1 PRIMARY KEY,
    col1 INT NULL
    );
    
    -- Small set of sample data
    TRUNCATE TABLE dbo.T1;
    
    INSERT INTO dbo.T1(id, col1) VALUES
    ( 2, NULL),
    ( 3,   10),
    ( 5,   -1),
    ( 7, NULL),
    (11, NULL),
    (13,  -12),
    (17, NULL),
    (19, NULL),
    (23, 1759);
    
    ;WITH C AS
    (
    SELECT
        id, 
        col1, 
        MAX(CASE WHEN col1 IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grp
    FROM dbo.T1
    )
    SELECT
        id, 
        col1, 
        (SELECT col1 FROM dbo.T1 WHERE id = grp) lastval    
    FROM C;
    


    1. ORACLE Casting DATE to TIMESTAMP WITH TIME ZONE WITHOFFSET

    2. 新しく作成されたレコードの ID (PK) を取得するには?

    3. sqlalchemyの複数の列を持つ別のテーブルからテーブルを更新する

    4. 結合されたテーブルから特定のプロパティを持つ行を無視するためのSQL