Mengisi kesenjangan waktu dan menyiratkan nilai yang hilang
Penting
Azure SQL Edge akan dihentikan pada 30 September 2025. Untuk informasi selengkapnya dan opsi migrasi, lihat Pemberitahuan penghentian.
Catatan
Azure SQL Edge tidak lagi mendukung platform ARM64.
Saat berhadapan dengan data rangkaian waktu, sangat mungkin data rangkaian waktu telah kehilangan nilai untuk atribut. Ada juga kemungkinan bahwa, karena sifat data, atau karena gangguan dalam pengumpulan data, ada kesenjangan dalam himpunan data.
Misalnya, saat mengumpulkan statistik penggunaan energi untuk perangkat pintar, setiap kali perangkat tidak beroperasi, ada celah dalam statistik penggunaan. Demikian pula, dalam skenario pengumpulan data telemetri mesin, ada kemungkinan bahwa sensor yang berbeda dikonfigurasi untuk memancarkan data pada frekuensi yang berbeda, menghasilkan nilai yang hilang untuk sensor. Misalnya, jika ada dua sensor, tegangan dan tekanan, dikonfigurasi masing-masing pada frekuensi 100 Hz dan 10-Hz, sensor tegangan memancarkan data setiap seratus detik, sementara sensor tekanan hanya memancarkan data setiap sepuluh detik.
Tabel berikut menjelaskan himpunan data telemetri mesin, yang dikumpulkan pada interval satu detik.
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
Ada dua karakteristik penting dari himpunan data sebelumnya.
- Himpunan data tidak berisi titik data apa pun yang terkait dengan beberapa stempel waktu
2020-09-07 06:14:47.000
,2020-09-07 06:14:48.000
,2020-09-07 06:14:50.000
,2020-09-07 06:14:53.000
, dan2020-09-07 06:14:55.000
. Tanda waktu ini adalah celah dalam himpunan data. - Ada nilai yang hilang, diwakili sebagai
null
, untuk pembacaan tegangan dan tekanan.
Pengisian kesenjangan adalah teknik yang membantu membuat kumpulan tanda waktu yang berdekatan dan berurutan untuk memudahkan analisis data rangkaian waktu. Pada Azure SQL Edge, cara termudah untuk mengisi kesenjangan dalam himpunan data seri waktu adalah dengan menentukan tabel sementara dengan distribusi waktu yang diinginkan lalu melakukan operasi LEFT OUTER JOIN
atau RIGHT OUTER JOIN
pada tabel himpunan data.
Mengambil data yang MachineTelemetry
diwakili sebelumnya sebagai contoh, kueri berikut dapat digunakan untuk menghasilkan kumpulan tanda waktu yang berdekatan dan diurutkan untuk analisis.
Catatan
Kueri berikut menghasilkan baris yang hilang, dengan nilai dan null
nilai tanda waktu untuk atribut.
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];
Kueri di atas menghasilkan output berikut yang berisi tanda waktu satu detik penuh dalam rentang yang ditentukan.
Berikut set hasilnya:
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
Kueri sebelumnya menghasilkan tanda waktu yang hilang untuk analisis data, namun tidak menggantikan salah satu nilai yang hilang (direpresentasikan sebagai null) untuk voltage
pembacaan dan pressure
. Di Azure SQL Edge, sintaks baru ditambahkan ke fungsi T-SQL LAST_VALUE()
dan FIRST_VALUE()
, yang menyediakan mekanisme untuk mengimputasi nilai yang hilang, berdasarkan nilai sebelumnya atau setelahnya dalam himpunan data.
Sintaks baru menambahkan klausul IGNORE NULLS
dan RESPECT NULLS
ke fungsi LAST_VALUE()
dan FIRST_VALUE()
. Kueri berikut pada himpunan MachineTelemetry
data menghitung nilai yang hilang menggunakan fungsi LAST_VALUE, di mana nilai yang hilang diganti dengan nilai terakhir yang diamati dalam himpunan data.
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;
Berikut set hasilnya:
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
Kueri berikut ini mengimputasi nilai yang hilang menggunakan fungsi LAST_VALUE()
dan FIRST_VALUE
. Untuk kolom ImputedVoltage
output , nilai terakhir yang diamati menggantikan nilai yang hilang, sementara untuk kolom ImputedPressure
output, nilai yang hilang digantikan oleh nilai yang diamati berikutnya dalam himpunan data.
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;
Berikut set hasilnya:
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
Catatan
Kueri di atas menggunakan fungsi FIRST_VALUE()
untuk mengganti nilai yang hilang dengan nilai berikutnya yang diamati. Hasil yang sama dapat dicapai dengan menggunakan fungsi LAST_VALUE()
dengan klausul ORDER BY <ordering_column> DESC
.