Pengelompokan catatan berdasarkan interval waktu

12

Saya memiliki tabel dengan skema berikut, dan saya perlu mendefinisikan kueri yang dapat mengelompokkan data berdasarkan interval waktu ( mis. Catatan per menit ) dan kemudian memberikan jumlah perubahan ke SnapShotValue sejak grup sebelumnya. Saat ini, SnapShotValue selalu bertambah jadi saya hanya perlu jumlah perbedaan. Adakah yang bisa membantu dengan permintaan SQL Server T-SQL yang mungkin melakukan ini? Saya terbuka untuk mengubah skema, tetapi inilah yang saya miliki saat ini.

Skema

CaptureTime   (datetime)
SnapShotValue (int)

Contoh data

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500

Hasil Permintaan yang Diinginkan

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured data changes up to the 2 minute mark
1 Jan 2012 00:03:00,   125 -- Sum of all captured data changes up to the 3 minute mark
JoeGeeky
sumber

Jawaban:

17
select dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0),
       sum(SnapShotValue)
from YourTable
group by dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)

SE-Data

datediff(minute, 0, CaptureTime)memberi Anda jumlah menit sejak itu 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)menambahkan jumlah menit sejak 1900-01-01T00:00:00untuk 1900-01-01T00:00:00berakhir dengan datetime dengan hanya menit.

Ada di 1+sana karena Anda ingin menit berikutnya.

Untuk melakukan hal yang sama dengan interval 5 menit, Anda perlu melakukan beberapa perhitungan. Bagi menit dengan 5dan gandakan dengan 5memberi Anda menit dibulatkan ke presisi 5 menit. Ini berfungsi karena hasil dari divisi integer di SQL Server adalah integer.

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)
Mikael Eriksson
sumber
Ini memberikan kerangka kerja yang bagus untuk jawabannya, tetapi saya masih mengalami sedikit kesulitan dalam memahami cara kerjanya. Ketika saya mencoba mengubah offset dari interval 1 menit ke interval 5 menit saya masih mendapatkan interval 1 menit dengan seluruh hasil dimulai pada titik awal yang berbeda. Ini sangat mungkin karena saya salah paham bagaimana ini bekerja. Bisakah Anda memberikan satu sampel lagi yang menunjukkan interval selain 1 menit? Terima kasih ...
JoeGeeky
0

Saya sedikit bingung dengan contoh ke-3 di sana, apakah ini seharusnya 1325? Didasarkan pada persyaratan menangkap jumlah nilai snapshot, kueri di bawah ini harus mendapatkan apa yang Anda cari.

select dateadd(minute,1,convert(varchar(20),capturetime)), sum(snapshotvalue)
from snapshotdata sd
group by dateadd(minute,1,convert(varchar(20),capturetime))
WT_W
sumber
0

Berikut ini adalah terjemahan dari jawaban yang diterima ke dalam PostgreSQL (saya memilih tanggal 1 Januari 2000 sebagai tanggal dasar. Ubahlah ke tanggal yang lebih awal jika data Anda lebih tua dari itu):

SELECT 
  TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
  , SUM(SnapShotValue)
FROM table_name
GROUP BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
ORDER BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
LoMaPh
sumber