Cách lấy mẫu hồ sơ theo thời gian


7

Vì vậy, tôi đã có một bảng trong SQL Server 2014 lưu trữ các sự kiện. Các sự kiện được tạo không nhanh hơn một lần trong 10 giây, nhưng có thể chậm hơn nhiều (phút hoặc giờ giữa các sự kiện). Thời gian giữa các sự kiện không thống nhất.

Tôi muốn lấy mẫu các hồ sơ theo thời gian.
Chẳng hạn, tôi muốn yêu cầu lấy mẫu 10 phút - vì vậy, nó sẽ lấy bản ghi 1 và bản ghi tiếp theo phải là bản ghi ít nhất 10 phút sau, và bản tiếp theo chậm hơn ít nhất 10 phút so với hàng 2 , và như thế.

Tôi có thể đạt được điều này bằng cách tiếp cận lặp lại, lặp qua từng bản ghi, nhưng tôi muốn để cơ sở dữ liệu thực hiện công việc. Vấn đề là, tôi không biết làm thế nào để sử dụng câu lệnh set / window T-SQL.

Bất cứ ai có thể giúp tôi ra?

Dữ liệu ví dụ:

EventID | RecordTime
--------+--------------------
   1    | 2017-04-01 12:00:00
   2    | 2017-04-01 12:00:10
   3    | 2017-04-01 12:00:20
   4    | 2017-04-01 12:00:32
   5    | 2017-04-01 12:05:42
   6    | 2017-04-01 12:09:00
   7    | 2017-04-01 12:24:12
   8    | 2017-04-01 12:36:46
   9    | 2017-04-01 12:36:57
  10    | 2017-04-01 15:00:00

Kết quả như ý:

EventID | RecordTime
--------+--------------------
   1    | 2017-04-01 12:00:00
   7    | 2017-04-01 12:24:12
   8    | 2017-04-01 12:36:46
  10    | 2017-04-01 15:00:00
  • Tất cả các sự kiện 2-6 đều trong vòng 10 phút của bản ghi 1, vì vậy tôi không muốn chúng.
  • EventID 7 chậm hơn 24 phút so với bản ghi cuối cùng trong tập kết quả của tôi (EventID 1), vì vậy tôi thực sự muốn nó.
  • EventID 8 chậm hơn 12 phút 34 giây so với bản ghi cuối cùng trong tập kết quả của tôi (EventID 7), vì vậy tôi thực sự muốn nó.
  • EventID 9 chậm hơn 11 giây so với bản ghi cuối cùng trong tập kết quả của tôi (EventID 8), vì vậy tôi không muốn nó.
  • EventID 10 là apx. Trễ hơn 2,5 giờ so với bản ghi cuối cùng trong tập kết quả của tôi (EventID 9), vì vậy tôi thực sự muốn nó.

Xin vui lòng, thêm một số dữ liệu mẫu và kết quả mong muốn.
McNets

@McNets: đã thêm một số dữ liệu mẫu và kết quả mong muốn. Hãy cho tôi biết nếu cần nhiều dữ liệu / khác nhau.
Sam Axe

Điều gì nếu bạn có một sự kiện tại 2017-04-01 12:10:01? Nó chỉ là 1 phút 1 giây sau sự kiện trước ( 2017-04-01 12:09:00), nhưng chỉ hơn 10 phút sau sự kiện đầu tiên ( 2017-04-01 12:00:00). Bạn có muốn xem sự kiện này trong tập kết quả?
Vladimir Baranov

Có thể dễ dàng chọn các sự kiện gần nhất với các khoảng thời gian 10 phút thống nhất (12:00, 12:10, 12:20, 12:30, ...), nhưng kết quả cuối cùng có thể có các sự kiện đôi khi có ít hơn 10 phút giữa họ Là loại kết quả này được chấp nhận?
Vladimir Baranov

@VladimirBaranov: Không, tôi sẽ không muốn sự kiện này lúc 12:10:01. Tôi đồng ý, chọn các sự kiện gần nhất với các khoảng cố định sẽ đơn giản. Tôi có thể đi theo con đường đó nếu tôi không thể tìm ra cách để làm điều này.
Sam Axe

Câu trả lời:


3

Nếu bạn không muốn sự kiện tại 12:10:01, thì câu trả lời rất đơn giản - sử dụng LEADhoặc LAGđể so sánh dấu thời gian của hai hàng liên tiếp. Chỉ cần lưu ý rằng nếu bạn có một chuỗi các sự kiện dài, trong đó mỗi cặp sự kiện cách nhau chưa đến 10 phút, thì truy vấn sẽ chỉ trả về sự kiện đầu tiên của chuỗi này.

Nói cách khác, phải có khoảng cách hơn 10 phút giữa hai sự kiện để thêm một hàng vào tập kết quả.

Dữ liệu mẫu

DECLARE @T TABLE(EventID int, RecordTime datetime2(0));
INSERT INTO @T (EventID, RecordTime) VALUES
( 1, '2017-04-01 12:00:00'),
( 2, '2017-04-01 12:00:10'),
( 3, '2017-04-01 12:00:20'),
( 4, '2017-04-01 12:00:32'),
( 5, '2017-04-01 12:05:42'),
( 6, '2017-04-01 12:09:00'),
( 7, '2017-04-01 12:24:12'),
( 8, '2017-04-01 12:36:46'),
( 9, '2017-04-01 12:36:57'),
(10, '2017-04-01 15:00:00');

Truy vấn

WITH
CTE
AS
(
    SELECT
        EventID
        ,RecordTime
        ,LAG(RecordTime) OVER (ORDER BY EventID) AS PrevRecordTime
    FROM @T
)
SELECT
    EventID
    ,RecordTime
FROM
    CTE
    CROSS APPLY
    (
        SELECT DATEDIFF(second, PrevRecordTime, RecordTime) AS RecordDiffSeconds
    ) AS CA
WHERE
    RecordDiffSeconds IS NULL
    OR RecordDiffSeconds > 600
ORDER BY EventID;

Kết quả

+---------+---------------------+
| EventID |     RecordTime      |
+---------+---------------------+
|       1 | 2017-04-01 12:00:00 |
|       7 | 2017-04-01 12:24:12 |
|       8 | 2017-04-01 12:36:46 |
|      10 | 2017-04-01 15:00:00 |
+---------+---------------------+

Đầu tiên, tôi chắc chắn đánh giá cao sự giúp đỡ. Thứ hai, tôi đã thử truy vấn của bạn với bộ mẫu và nó thực sự trả về các bản ghi thích hợp. Tuy nhiên, khi áp dụng cho tập dữ liệu thực của tôi (141 bản ghi kéo dài 2 giờ), nó sẽ trả về kết quả không mạch lạc.
Sam Axe

@SamAxe, cảm ơn Sam. Tôi khuyên bạn nên hỏi một câu hỏi khác với dữ liệu mẫu chi tiết hơn bao gồm tất cả các trường hợp thú vị. Hiển thị kết quả mong đợi của bạn cho những trường hợp này.
Vladimir Baranov

Tiếp theo nếu bạn không phiền (hoặc tôi có thể đăng câu hỏi mới, bất cứ điều gì có ý nghĩa hơn): Nếu chúng tôi thay đổi RecordTime của EventID 7 thành 2017-04-01 12:10:12(đặt 10 phút 12 giây sau EventID 1) thì nó không được bao gồm vì khoảng cách với bản ghi trước đó (EventID 6) là 1 phút 12 giây. Tuy nhiên, nó được mong muốn rằng nó được bao gồm. Có suy nghĩ gì không?
Sam Axe

@SamAxe, tôi nghĩ rằng tốt hơn là hỏi một câu hỏi khác. Lúc đầu, bạn nói trong bình luận rằng bạn không muốn bao gồm những sự kiện như vậy. Bây giờ bạn đã thay đổi suy nghĩ của bạn. Đặt một câu hỏi khác, cung cấp một bộ dữ liệu mẫu tốt bao gồm tất cả các trường hợp góc và giải thích logic / kết quả bạn cần trong mỗi trường hợp.
Vladimir Baranov

Trời ơi. Tôi hoàn toàn đọc sai câu hỏi đó trong các ý kiến. Lời xin lỗi của tôi. Vâng, tôi sẽ đăng một câu hỏi mới.
Sam Axe
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.