Kayıtları zaman aralıklarına göre gruplama


13

Aşağıdaki şema ile bir tablo var ve ben zaman aralıklarına ( Ex. Dakika başına kayıtlar ) dayalı veri gruplamak ve daha sonra önceki gruptan beri SnapShotValue değişikliklerin toplamını sağlamak bir sorgu tanımlamak gerekir . Şu anda, SnapShotValue her zaman artar, bu yüzden sadece farklılıkların toplamına ihtiyacım var. Herkes bunu yapabilir bir SQL Server T-SQL sorgusu ile yardımcı olabilir misiniz? Şemayı değiştirmeye açıkım, ama şu anda sahip olduğum şey bu.

Şema

CaptureTime   (datetime)
SnapShotValue (int)

Örnek veri

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

İstenen Sorgu Sonucu

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

Yanıtlar:


18
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)o zamandan bu yana geçen dakika sayısını verir 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)beri dakika sayısını ekler 1900-01-01T00:00:00için 1900-01-01T00:00:00sadece birkaç dakika ile bir datetime ile biten.

1+Bir sonraki dakika istedim çünkü yoktur.

Aynı işlemi 5 dakikalık aralıklarla yapmak için bazı hesaplamalar yapmanız gerekir. İle dakikayı bölün 5ve çarpma ile 5dakika 5 dakika hassas aşağı yuvarlanır verir. Bu çalışır, çünkü SQL Server'da bir tamsayı bölümü bir tamsayıdır.

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)

Bu, cevap için güzel bir çerçeve sağladı, ancak bunun nasıl çalıştığını anlamakta hala biraz sorun yaşıyorum. Ofseti 1 dakikalık aralıktan 5 dakikalık aralığa değiştirmeye çalıştığımda, tüm sonuç farklı bir başlangıç ​​noktasından başlayarak hala 1 dakikalık bir aralık alıyorum. Bu çok muhtemel çünkü bunun nasıl çalıştığını yanlış anlıyorum. 1 dakikadan fazla aralık gösteren bir örnek daha verebilir misiniz? Teşekkürler ...
JoeGeeky

0

Oradaki 3. örnekle biraz kafam karıştı, bunun 1325 olması mı gerekiyor? Anlık görüntü değerlerinin toplamını yakalama gereksinimlerine dayanarak, aşağıdaki sorgu peşinde olduğunuz şeyi almalıdır.

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

0

Kabul edilen cevabın PostgreSQL'e çevrilmesi (temel tarih olarak 1 Ocak 2000'i seçtim. Verileriniz bundan daha eskiyse eski bir tarihe değiştirin):

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' 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.