Udostępnij za pośrednictwem


Wypełnianie luk czasu i przypisywanie brakujących wartości

Ważne

Usługa Azure SQL Edge zostanie wycofana 30 września 2025 r. Aby uzyskać więcej informacji i opcji migracji, zobacz powiadomienie o wycofaniu.

Uwaga

Usługa Azure SQL Edge nie obsługuje już platformy ARM64.

Podczas pracy z danymi szeregów czasowych często jest możliwe, że dane szeregów czasowych mają brakujące wartości atrybutów. Istnieje również możliwość, że ze względu na charakter danych lub z powodu przerw w zbieraniu danych istnieją luki czasowe w zestawie danych.

Na przykład podczas zbierania statystyk użycia energii dla urządzenia inteligentnego zawsze, gdy urządzenie nie działa, występują luki w statystykach użycia. Podobnie w scenariuszu zbierania danych telemetrycznych maszyny możliwe jest, że różne czujniki są skonfigurowane do emitowania danych o różnych częstotliwościach, co powoduje brak wartości czujników. Na przykład, jeśli istnieją dwa czujniki, napięcie i ciśnienie, skonfigurowane odpowiednio z częstotliwością 100 Hz i 10-Hz, czujnik napięcia emituje dane co setną część sekundy, podczas gdy czujnik ciśnienia emituje tylko dane co jedną dziesiątą sekundy.

W poniższej tabeli opisano zestaw danych telemetrycznych maszyny, który został zebrany w jednym interwale sekundy.

timestamp               VoltageReading  PressureReading
----------------------- --------------- ----------------
2020-09-07 06:14:41.000 164.990400      97.223600
2020-09-07 06:14:42.000 162.241300      93.992800
2020-09-07 06:14:43.000 163.271200      NULL
2020-09-07 06:14:44.000 161.368100      93.403700
2020-09-07 06:14:45.000 NULL            NULL
2020-09-07 06:14:46.000 NULL            98.364800
2020-09-07 06:14:49.000 NULL            94.098300
2020-09-07 06:14:51.000 157.695700      103.359100
2020-09-07 06:14:52.000 157.019200      NULL
2020-09-07 06:14:54.000 NULL            95.352000
2020-09-07 06:14:56.000 159.183500      100.748200

Istnieją dwie ważne cechy powyższego zestawu danych.

  • Zestaw danych nie zawiera żadnych punktów danych związanych z kilkoma znacznikami 2020-09-07 06:14:47.000czasu, , 2020-09-07 06:14:48.000, 2020-09-07 06:14:50.0002020-09-07 06:14:53.000i 2020-09-07 06:14:55.000. Te znaczniki czasu to luki w zestawie danych.
  • Brak wartości reprezentowanych jako null, dla odczytów napięcia i ciśnienia.

Wypełnienie luki

Wypełnianie luk to technika, która ułatwia tworzenie ciągłych, uporządkowanych zestawów sygnatur czasowych w celu ułatwienia analizy danych szeregów czasowych. W usłudze Azure SQL Edge najprostszym sposobem wypełnienia luk w zestawie danych szeregów czasowych jest zdefiniowanie tabeli tymczasowej z odpowiednim rozkładem czasu, a następnie wykonywanie LEFT OUTER JOIN operacji lub RIGHT OUTER JOIN w tabeli zestawów danych.

MachineTelemetry Biorąc dane reprezentowane wcześniej jako przykład, następujące zapytanie może służyć do generowania ciągłych, uporządkowanych zestawów sygnatur czasowych na potrzeby analizy.

Uwaga

Poniższe zapytanie generuje brakujące wiersze z wartościami znacznika czasu i null wartościami atrybutów.

CREATE TABLE #SeriesGenerate (dt DATETIME PRIMARY KEY CLUSTERED)
GO

DECLARE @startdate DATETIME = '2020-09-07 06:14:41.000',
    @endtime DATETIME = '2020-09-07 06:14:56.000'

WHILE (@startdate <= @endtime)
BEGIN
    INSERT INTO #SeriesGenerate
    VALUES (@startdate)

    SET @startdate = DATEADD(SECOND, 1, @startdate)
END

SELECT a.dt AS TIMESTAMP,
    b.VoltageReading,
    b.PressureReading
FROM #SeriesGenerate a
LEFT JOIN MachineTelemetry b
    ON a.dt = b.[timestamp];

Powyższe zapytanie generuje następujące dane wyjściowe zawierające wszystkie jednorazowe znaczniki czasu w określonym zakresie.

Oto zestaw wyników:

timestamp               VoltageReading    PressureReading
----------------------- ----------------- ----------------
2020-09-07 06:14:41.000 164.990400        97.223600
2020-09-07 06:14:42.000 162.241300        93.992800
2020-09-07 06:14:43.000 163.271200        NULL
2020-09-07 06:14:44.000 161.368100        93.403700
2020-09-07 06:14:45.000 NULL              NULL
2020-09-07 06:14:46.000 NULL              98.364800
2020-09-07 06:14:47.000 NULL              NULL
2020-09-07 06:14:48.000 NULL              NULL
2020-09-07 06:14:49.000 NULL              94.098300
2020-09-07 06:14:50.000 NULL              NULL
2020-09-07 06:14:51.000 157.695700        103.359100
2020-09-07 06:14:52.000 157.019200        NULL
2020-09-07 06:14:53.000 NULL              NULL
2020-09-07 06:14:54.000 NULL              95.352000
2020-09-07 06:14:55.000 NULL              NULL
2020-09-07 06:14:56.000 159.183500        100.748200

Uzupełnianie brakujących wartości

Poprzednie zapytanie wygenerowało brakujące znaczniki czasu na potrzeby analizy danych, jednak nie zamieniło żadnych brakujących wartości (reprezentowanych jako null) i voltage pressure odczytów. W usłudze Azure SQL Edge dodano nową składnię do języka T-SQL LAST_VALUE() i FIRST_VALUE() funkcji, które zapewniają mechanizmy imputowania brakujących wartości na podstawie powyższych lub następujących wartości w zestawie danych.

Nowa składnia dodaje IGNORE NULLS klauzulę LAST_VALUE() i RESPECT NULLS do funkcji i FIRST_VALUE() . Następujące zapytanie w MachineTelemetry zestawie danych oblicza brakujące wartości przy użyciu funkcji LAST_VALUE, gdzie brakujące wartości są zastępowane ostatnią obserwowaną wartością w zestawie danych.

SELECT timestamp,
    VoltageReading AS OriginalVoltageValues,
    LAST_VALUE(VoltageReading) IGNORE NULLS OVER (
        ORDER BY timestamp
        ) AS ImputedUsingLastValue,
    PressureReading AS OriginalPressureValues,
    LAST_VALUE(PressureReading) IGNORE NULLS OVER (
        ORDER BY timestamp
        ) AS ImputedUsingLastValue
FROM MachineTelemetry
ORDER BY timestamp;

Oto zestaw wyników:

timestamp               OrigVoltageVals  ImputedVoltage OrigPressureVals  ImputedPressure
----------------------- ---------------- -------------- ----------------- ----------------
2020-09-07 06:14:41.000 164.990400       164.990400     97.223600         97.223600
2020-09-07 06:14:42.000 162.241300       162.241300     93.992800         93.992800
2020-09-07 06:14:43.000 163.271200       163.271200     NULL              93.992800
2020-09-07 06:14:44.000 161.368100       161.368100     93.403700         93.403700
2020-09-07 06:14:45.000 NULL             161.368100     NULL              93.403700
2020-09-07 06:14:46.000 NULL             161.368100     98.364800         98.364800
2020-09-07 06:14:49.000 NULL             161.368100     94.098300         94.098300
2020-09-07 06:14:51.000 157.695700       157.695700     103.359100        103.359100
2020-09-07 06:14:52.000 157.019200       157.019200     NULL              103.359100
2020-09-07 06:14:54.000 NULL             157.019200     95.352000         95.352000
2020-09-07 06:14:56.000 159.183500       159.183500     100.748200        100.748200

Poniższe zapytanie imputuje brakujące wartości przy użyciu funkcji LAST_VALUE() i FIRST_VALUE . W kolumnie wyjściowej ostatnia obserwowana wartość zastępuje brakujące wartości, podczas gdy dla kolumny ImputedVoltageImputedPressure wyjściowej brakujące wartości są zastępowane przez następną obserwowaną wartość w zestawie danych.

SELECT dt AS [timestamp],
    VoltageReading AS OrigVoltageVals,
    LAST_VALUE(VoltageReading) IGNORE NULLS OVER (
        ORDER BY dt
        ) AS ImputedVoltage,
    PressureReading AS OrigPressureVals,
    FIRST_VALUE(PressureReading) IGNORE NULLS OVER (
        ORDER BY dt ROWS BETWEEN CURRENT ROW
                AND UNBOUNDED FOLLOWING
        ) AS ImputedPressure
FROM (
    SELECT a.dt,
        b.VoltageReading,
        b.PressureReading
    FROM #SeriesGenerate a
    LEFT JOIN MachineTelemetry b
        ON a.dt = b.[timestamp]
    ) A
ORDER BY timestamp;

Oto zestaw wyników:

timestamp               OrigVoltageVals  ImputedVoltage  OrigPressureVals  ImputedPressure
----------------------- ---------------- --------------- ----------------- ---------------
2020-09-07 06:14:41.000 164.990400       164.990400      97.223600         97.223600
2020-09-07 06:14:42.000 162.241300       162.241300      93.992800         93.992800
2020-09-07 06:14:43.000 163.271200       163.271200      NULL              93.403700
2020-09-07 06:14:44.000 161.368100       161.368100      93.403700         93.403700
2020-09-07 06:14:45.000 NULL             161.368100      NULL              98.364800
2020-09-07 06:14:46.000 NULL             161.368100      98.364800         98.364800
2020-09-07 06:14:47.000 NULL             161.368100      NULL              94.098300
2020-09-07 06:14:48.000 NULL             161.368100      NULL              94.098300
2020-09-07 06:14:49.000 NULL             161.368100      94.098300         94.098300
2020-09-07 06:14:50.000 NULL             161.368100      NULL              103.359100
2020-09-07 06:14:51.000 157.695700       157.695700      103.359100        103.359100
2020-09-07 06:14:52.000 157.019200       157.019200      NULL              95.352000
2020-09-07 06:14:53.000 NULL             157.019200      NULL              95.352000
2020-09-07 06:14:54.000 NULL             157.019200      95.352000         95.352000
2020-09-07 06:14:55.000 NULL             157.019200      NULL              100.748200
2020-09-07 06:14:56.000 159.183500       159.183500      100.748200        100.748200

Uwaga

Powyższe zapytanie używa FIRST_VALUE() funkcji , aby zastąpić brakujące wartości następną obserwowaną wartością. Ten sam wynik można osiągnąć przy użyciu LAST_VALUE() funkcji z klauzulą ORDER BY <ordering_column> DESC .