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

特定の日付の欠落データを識別する SQL Server クエリ

    集計テーブル を使用できます Date のすべての組み合わせを生成する と Unit .すべての組み合わせを取得したら、NOT EXISTS を使用できます 不足しているデータを取得します。

    SQL フィドル

    DECLARE @minDate AS DATE
    DECLARE @maxDate AS DATE
    
    SELECT
        @minDate = MIN([Date]),
        @maxDate = MAX([Date])
    FROM TestData
    
    
    ;WITH E1(N) AS(
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    ),
    E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b),
    E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b),
    Tally(N) AS(
        SELECT TOP(DATEDIFF(DAY, @minDate, @maxDate) + 1)
            ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
        FROM E4
    ),
    CteDatesAndUnits([Date], Unit) AS(
        SELECT
            DATEADD(DAY, t.N - 1, @minDate),
            u.Unit
        FROM Tally t
        CROSS JOIN (
            SELECT DISTINCT Unit FROM TestData
        )u
    )
    SELECT *
    FROM CteDatesAndUnits c
    WHERE NOT EXISTS(
        SELECT * 
        FROM TestData
        WHERE
            [Date] = c.[Date]
            AND Unit = c.Unit
    )
     

    結果

    <プレ>| Date | Unit | |------------|--------| | 2012-01-01 | Unit B | | 2012-01-02 | Unit A | | 2012-01-02 | Unit B |

    Unit以来 常に Unit A になります そしてUnit B 、この行を置き換えることができます:

    SELECT DISTINCT Unit FROM TestData
     

    これで:

    SELECT 'Unit A' AS Unit UNION ALL SELECT 'Unit B'
     


    1. あるテーブルから別のテーブルにデータを移動する、postgresqlエディション

    2. MySQLを学ぶための5つの最高のオンラインコース

    3. SQL Server DataTypesと同等のC#

    4. MariaDBまたはMySQLデータベースの物理バックアップを作成する