2013-08-23 30 views
5

Tôi có một bảng với cấu trúc sauGet Thời gian chênh lệch giữa nhóm các bản ghi

ID   ActivityTime    Status 
19  2013-08-23 14:52   1 
19  2013-08-23 14:50   1 
19  2013-08-23 14:45   2 
19  2013-08-23 14:35   2 
19  2013-08-23 14:32   1 
19  2013-08-23 14:30   1 
19  2013-08-23 14:25   2 
19  2013-08-23 14:22   2 
53  2013-08-23 14:59   1 
53  2013-08-23 14:56   1 
53  2013-08-23 14:57   1 
53  2013-08-23 14:52   2 
53  2013-08-23 14:50   2 
53  2013-08-23 14:49   2 
53  2013-08-23 14:18   2 
53  2013-08-23 14:30   1 

Tôi muốn tính toán tổng số chênh lệch thời gian cho mỗi ID chống Status 2. Ví dụ ID 19 ở lại Tình trạng 2 từ 14 : 35 đến 14:50 (15 phút), sau đó 14:22 đến 14:30 (8 phút). Vì vậy, tổng số ID 19 ở trạng thái 2 là 23 phút. (Trong cả hai trường hợp, tôi coi thời gian tối thiểu cho trạng thái 2 là trạng thái 1) Vấn đề là làm cách nào để chỉ bao gồm sự khác biệt giữa trạng thái khác nhau trong hàng kế tiếp.

Ví dụ: tôi sẽ loại trừ bản ghi đầu tiên trong bảng có trạng thái 1 và chọn hàng thứ hai. Tương tự là trường hợp với Trạng thái 2. Tôi sẽ chọn thời gian tối thiểu, tính toán sự khác biệt của chúng và sau đó thêm chúng cho nhiều nhóm trạng thái đối với mỗi kênh.

Tôi đã thử sử dụng CURSOR nhưng dường như không hoạt động. Tôi cũng khá tự tin rằng tôi có thể đạt được điều đó trong C# sau khi nhận được tất cả các dữ liệu và sau đó lặp qua nó. Nhưng tôi chỉ tự hỏi nếu có một cách trực tiếp để nhận được thông tin mà không có một vòng lặp. Tôi cũng đã tạo một dữ liệu SQL fiddle nhưng tôi không thể làm cho nó hoạt động được. Tôi đến từ nền C# với kiến ​​thức cơ bản về SQL. Sẽ rất vui nếu ai đó có thể giúp tôi.

+0

'14:35 Để 14:50 (5 phút) '? 5 phút hoặc 15 phút? Bạn nên xem lại quy tắc trong câu hỏi của mình và đảm bảo rằng đó là quy tắc bạn muốn vì điều rất quan trọng đối với câu trả lời có thể giúp bạn. –

+0

Tôi không hoàn toàn có được những gì bạn muốn làm .. bạn có thể xây dựng thêm một chút không? – Botis

+0

@KingKing, đó là lỗi đánh máy, cảm ơn bạn đã chỉ ra điều đó. – user2711965

Trả lời

6

CTE (common table expressions) có thể được sử dụng như bảng tạm thời chuyên dụng. Nó cho phép bạn (trong trường hợp này) tự động tạo một số hàng mà sau này bạn có thể tự tạo một tham gia.

Tôi nghĩ rằng bạn đang tìm kiếm một cái gì đó như thế này:

--create temp table 
select 19 as id,'2013-08-23 14:52' as activitytime,1 as status 
into #temp 
union all 
select 19,'2013-08-23 14:50',1 union all 
select 19,'2013-08-23 14:45',2 union all 
select 19,'2013-08-23 14:35',2 union all 
select 19,'2013-08-23 14:32',1 union all 
select 19,'2013-08-23 14:30',1 union all 
select 19,'2013-08-23 14:25',2 union all 
select 19,'2013-08-23 14:22',2 union all 
select 53,'2013-08-23 14:59',1 union all 
select 53,'2013-08-23 14:56',1 union all 
select 53,'2013-08-23 14:57',1 union all 
select 53,'2013-08-23 14:52',2 union all 
select 53,'2013-08-23 14:50',2 union all 
select 53,'2013-08-23 14:49',2 union all 
select 53,'2013-08-23 14:18',2 union all 
select 53,'2013-08-23 14:30',1 

--build cte table 
;WITH cte 
AS (
SELECT 
    *, 
    ROW_NUMBER() OVER (ORDER BY id, activitytime) AS RowNum 
FROM 
    #temp 
) 

--query cte table, self joining row 1 to row 2 to compare. 
SELECT a.id, sum(DATEDIFF(minute,b.ActivityTIme,a.ActivityTime)) as TotalTime 
FROM 
cte AS A 
LEFT OUTER JOIN cte AS B 
ON A.RowNum = B.RowNum + 1 and a.id = b.id 
where b.status = 2 
group by a.id 
+1

Cảm ơn rất nhiều, điều này có vẻ hoàn hảo, tôi muốn tôi có thể upvote bạn nhiều lần. – user2711965

+1

Lưu ý rằng tôi đang đặt hàng truy vấn đầu tiên theo ID và thời gian hoạt động. Đây là cách tôi thiết lập thứ tự hàng. Điều này cần phải được thiết lập bởi vì bạn cần biết hàng "tiếp theo" là gì.Phần thứ hai của truy vấn là đệ quy tham gia hàng hiện tại tới hàng kế tiếp – paqogomez

+1

Truy vấn này đếm tổng cộng giữa tất cả 'Thời gian hoạt động' trong đó' Trạng thái' = 2, nhưng tổng thực phải nằm trong hàng đầu tiên với 'Trạng thái = 2' và hàng xuất hiện đầu tiên tiếp theo với 'Trạng thái = 1' – Fabio