จัดกลุ่มระเบียนตามช่วงเวลา


12

ฉันมีตารางที่มีสคีมาดังต่อไปนี้และฉันต้องการกำหนดคิวรีที่สามารถจัดกลุ่มข้อมูลตามช่วงเวลา ( เช่นเรคคอร์ดต่อนาที ) จากนั้นให้ผลรวมของการเปลี่ยนแปลง SnapShotValue ตั้งแต่กลุ่มก่อนหน้า ในปัจจุบัน SnapShotValue เพิ่มขึ้นเรื่อย ๆ ดังนั้นฉันจึงต้องการเพียงผลรวมของความแตกต่าง ใครสามารถช่วยกับแบบสอบถาม SQL Server T-SQL ที่อาจทำเช่นนี้? ฉันเปิดให้เปลี่ยนสคีมา แต่นี่คือสิ่งที่ฉันมีอยู่ในปัจจุบัน

schema

CaptureTime   (datetime)
SnapShotValue (int)

ข้อมูลตัวอย่าง

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

ผลลัพธ์ข้อความค้นหาที่ต้องการ

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

คำตอบ:


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-ข้อมูล

datediff(minute, 0, CaptureTime)1900-01-01T00:00:00ช่วยให้คุณมีจำนวนนาทีตั้งแต่

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)เพิ่มจำนวนนาทีนับตั้งแต่1900-01-01T00:00:00การ1900-01-01T00:00:00สิ้นสุดกับวันที่และเวลาที่มีเพียงไม่กี่นาที

ที่1+นั่นเพราะคุณต้องการในนาทีต่อไป

ในการทำเช่นเดียวกันกับช่วงเวลา 5 นาทีคุณต้องทำการคำนวณบางอย่าง แบ่งนาทีด้วย5และคูณด้วย5จะช่วยให้คุณได้นาทีที่มีความแม่นยำถึง 5 นาที สิ่งนี้ทำงานได้เนื่องจากผลลัพธ์ของการหารจำนวนเต็มใน SQL Server เป็นจำนวนเต็ม

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

นี่เป็นกรอบที่ดีสำหรับคำตอบ แต่ฉันยังคงมีปัญหาเล็กน้อยในการเข้าใจวิธีการทำงาน เมื่อฉันพยายามที่จะเปลี่ยนการชดเชยจากช่วงเวลา 1 นาทีเป็นช่วงเวลา 5 นาทีฉันยังคงได้รับช่วงเวลา 1 นาทีโดยที่ผลลัพธ์ทั้งหมดเริ่มต้นที่จุดเริ่มต้นที่แตกต่างกัน สิ่งนี้มีโอกาสมากเพราะฉันเข้าใจผิดว่ามันทำงานอย่างไร คุณสามารถให้ตัวอย่างอีกหนึ่งตัวอย่างแสดงช่วงเวลาอื่นจากนั้น 1 นาทีได้หรือไม่ ขอบคุณ ...
JoeGeeky

0

ฉันสับสนเล็กน้อยจากตัวอย่างที่ 3 ตรงนี้น่าจะเป็น 1,325 หรือไม่ ขึ้นอยู่กับข้อกำหนดของการจับภาพรวมของภาพรวมค่าแบบสอบถามด้านล่างควรได้รับสิ่งที่คุณหลังจาก

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

0

ต่อไปนี้คือการแปลคำตอบที่ยอมรับลงในPostgreSQL (ฉันเลือกวันที่ 1 มกราคม 2000 เป็นวันฐานให้เปลี่ยนเป็นวันก่อนหน้าหากข้อมูลของคุณเก่ากว่านั้น):

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' 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.