sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server-fråga som identifierar saknade data för specifika datum

Du kan använda en Tally Table för att generera alla kombinationer av Date och Unit . När du har fått alla kombinationer kan du använda NOT EXISTS för att hämta de saknade uppgifterna.

SQL Fiddle

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
)

Resultat

|       Date |   Unit |
|------------|--------|
| 2012-01-01 | Unit B |
| 2012-01-02 | Unit A |
| 2012-01-02 | Unit B |

Eftersom Unit kommer alltid att vara Unit A och Unit B , kan du ersätta denna rad:

SELECT DISTINCT Unit FROM TestData

med detta:

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


  1. Infoga en textfil i Oracle med Bulk Insert

  2. Gör flera inmatningar i mysql-tabellen samtidigt med en skicka-knapp

  3. Fixar ORA-65096-fel när man skapar automatiserade tester i Django med Oracle

  4. Rails 4 Postgresql array data-typ:uppdatering av värden