Phân nhóm các bản ghi dựa trên các khoảng thời gian


12

Tôi có một bảng với lược đồ sau và tôi cần xác định một truy vấn có thể nhóm dữ liệu dựa trên các khoảng thời gian ( ví dụ: các bản ghi mỗi phút ) và sau đó cung cấp tổng số các thay đổi cho SnapShotValue kể từ nhóm trước. Hiện tại, SnapShotValue luôn tăng nên tôi chỉ cần tổng số chênh lệch. Bất cứ ai cũng có thể giúp với một truy vấn SQL Server T-SQL có thể làm điều này? Tôi sẵn sàng thay đổi lược đồ, nhưng đây là những gì tôi hiện đang có.

Lược đồ

CaptureTime   (datetime)
SnapShotValue (int)

Dữ liệu mẫu

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

Kết quả truy vấn mong muốn

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

Câu trả lời:


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

Dữ liệu SE

datediff(minute, 0, CaptureTime)cung cấp cho bạn số phút kể từ khi 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)thêm số phút kể từ khi 1900-01-01T00:00:00để 1900-01-01T00:00:00kết thúc với một datetime với chỉ vài phút.

1+bởi vì bạn muốn phút tiếp theo.

Để làm tương tự với khoảng thời gian 5 phút, bạn cần thực hiện một số tính toán. Chia số phút với 5và nhân với 5cho bạn số phút được làm tròn xuống chính xác 5 phút. Điều này hoạt động vì kết quả của một phân chia số nguyên trong SQL Server là một số nguyên.

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

Điều này cung cấp một khuôn khổ tốt đẹp cho câu trả lời, nhưng tôi vẫn gặp một chút khó khăn để hiểu cách thức hoạt động của nó. Khi tôi cố gắng thay đổi độ lệch từ khoảng thời gian 1 phút sang khoảng thời gian 5 phút, tôi vẫn nhận được khoảng thời gian 1 phút với toàn bộ kết quả bắt đầu từ một điểm bắt đầu khác. Điều này rất có thể bởi vì tôi đang hiểu sai về cách thức hoạt động của nó. Bạn có thể cung cấp thêm một mẫu cho thấy một khoảng thời gian khác sau 1 phút không? Cảm ơn ...
JoeGeeky

0

Tôi hơi bối rối với ví dụ thứ 3 ở đó, đây có phải là 1325 không? Dựa trên các yêu cầu của việc nắm bắt tổng các giá trị snapshot, truy vấn bên dưới sẽ nhận được những gì bạn đang theo đuổi.

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

0

Sau đây là bản dịch câu trả lời được chấp nhận sang PostgreSQL (Tôi đã chọn ngày 1 tháng 1 năm 2000, làm ngày cơ sở. Thay đổi nó thành ngày trước nếu dữ liệu của bạn cũ hơn đó):

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' 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.