sql >> Database teknologi >  >> RDS >> Sqlserver

find de manglende poster for arbejdsdagene og udfyld rækken med værdierne fra den nærmeste dato

For disse typer forespørgsler opnår du betydelige ydeevnefordele ved at oprette en kalendertabel, der indeholder hver dato, du nogensinde får brug for at teste. (Hvis du er bekendt med udtrykket "dimensionstabeller", er dette kun en sådan tabel for at opregne hver interessedato.)

Desuden kan forespørgslen som helhed blive væsentligt enklere.

SELECT
   cal.calendar_date   AS data_date,
   CASE WHEN prev_data.gap <= next_data.gap
        THEN prev_data.data_value
        ELSE COALESCE(next_data.data_value, prev_data.data_value)
   END
       AS data_value
FROM
    calendar   AS cal
OUTER APPLY
(
    SELECT TOP(1)
        data_date,
        data_value,
        DATEDIFF(DAY, data_date, cal.calendar_date)   AS gap
    FROM
        data_table
    WHERE
        data_date <= cal.calendar_date
    ORDER BY
        data_date DESC
)
   prev_data
OUTER APPLY
(
    SELECT TOP(1)
        data_date,
        data_value,
        DATEDIFF(DAY, cal.calendar_date, data_date)   AS gap
    FROM
        data_table
    WHERE
        data_date >  cal.calendar_date
    ORDER BY
        data_date ASC
)
   next_data
WHERE
   cal.calendar_date BETWEEN '2015-01-01' AND '2015-12-31'
;

REDIGER Svar på din kommentar med et andet krav

At altid få "værdien ovenfor" er nemmere, og at indsætte disse værdier i en tabel er let nok...

INSERT INTO
    data_table
SELECT
   cal.calendar_date,
   prev_data.data_value
FROM
    calendar   AS cal
CROSS APPLY
(
    SELECT TOP(1)
        data_date,
        data_value
    FROM
        data_table
    WHERE
        data_date <= cal.calendar_date
    ORDER BY
        data_date DESC
)
   prev_data
WHERE
       cal.calendar_date BETWEEN '2015-01-01' AND '2015-12-31'
   AND cal.calendar_date <> prev_data.data_date
;

Bemærk: Du kan tilføje WHERE prev_data.gap > 0 til den større forespørgsel ovenfor for kun at få datoer, der ikke allerede har data.



  1. Kopier data fra en kolonne til en anden kolonne

  2. Oracle getConnection langsom

  3. PHP Count site view skaber en række hver dag

  4. JPA Tabelnavne med store bogstaver