2013-08-23 11 views
5

मैं निम्नलिखित संरचना के साथ एक मेज हैरिकॉर्ड

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 

मैं उदाहरण आईडी के लिए स्थिति 2. खिलाफ एक आईडी 19 14 से स्थिति 2 पर रहे के लिए कुल समय अंतर गणना करना चाहते हैं के समूह के बीच समय का अंतर हो जाओ : 35 से 14:50 (15 मिनट), फिर 14:22 से 14:30 (8 मिनट)। तो स्थिति आईडी पर कुल आईडी 1 9 मिनट 23 मिनट है। समस्या है कि कैसे मैं केवल स्थिति है जहाँ वे अगली पंक्ति में अलग हैं के बीच का अंतर शामिल है (दोनों ही मामलों में मैं स्थिति 1 स्थिति 2 के लिए न्यूनतम समय माना जाता है)।

उदाहरण के लिए मैं स्थिति 1 के साथ तालिका में पहला रिकॉर्ड बहिष्कृत करता हूं और दूसरी पंक्ति चुनता हूं। स्थिति 2 के साथ ही मामला है। मैं न्यूनतम समय चुनता हूं, उनके अंतर की गणना करता हूं और फिर प्रत्येक चैनल के खिलाफ स्थिति के कई समूहों के लिए उन्हें जोड़ता हूं।

मैंने CURSOR का उपयोग करने का प्रयास किया है लेकिन यह काम नहीं कर सकता है। मुझे भी पूरा भरोसा है कि मैं सभी डेटा प्राप्त करने के बाद सी # में प्राप्त कर सकता हूं और उसके बाद लूपिंग कर सकता हूं। लेकिन मैं बस सोच रहा हूं कि लूप के बिना जानकारी प्राप्त करने का सीधा तरीका है या नहीं। मैंने डेटा के साथ SQL fiddle भी बनाया, लेकिन मुझे यह काम नहीं लग रहा है। मैं एस # पृष्ठभूमि से एसक्यूएल के बुनियादी ज्ञान के साथ आ रहा हूं। अगर कोई मेरी मदद कर सकता है तो खुशी होगी।

+0

'14:35 14:50 (5 मिनट)' के लिए? 5 मिनट या 15 मिनट? आपको अपने प्रश्न में नियम की समीक्षा करनी चाहिए और यह सुनिश्चित करना चाहिए कि आप यही चाहते हैं क्योंकि उत्तर आपकी मदद करने में सक्षम होने के लिए बहुत महत्वपूर्ण है। –

+0

मुझे वह नहीं मिलता है जो आप करना चाहते हैं .. क्या आप शायद थोड़ा और विस्तार कर सकते हैं? – Botis

+0

@ किंगिंगकिंग, जो एक टाइपो था, इसे इंगित करने के लिए धन्यवाद। – user2711965

उत्तर

6

सीटीई (common table expressions) एक विशेष अस्थायी तालिका की तरह इस्तेमाल किया जा सकता है। यह आपको (इस मामले में) गतिशील रूप से एक पंक्ति संख्या बनाने की अनुमति देता है जिसे आप बाद में स्वयं में शामिल कर सकते हैं।

मुझे लगता है कि आप कुछ इस तरह की तलाश में हैं:

--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

बहुत बहुत धन्यवाद, यह सही दिखता है, काश मैं आपको कई बार ऊपर उठा सकता हूं। – user2711965

+1

ध्यान दें कि मैं आईडी और गतिविधि समय से पहली क्वेरी का आदेश दे रहा हूं। इस तरह मैं पंक्ति क्रम स्थापित कर रहा हूं। इसे स्थापित करने की आवश्यकता है क्योंकि आपको यह जानने की जरूरत है कि "अगली" पंक्ति क्या है।क्वेरी का दूसरा भाग रिकर्सन है जो वर्तमान पंक्ति को अगली पंक्ति में जोड़ता है – paqogomez

+1

यह क्वेरी सभी 'गतिविधि समय' के बीच एक राशि को गिनती है जहां 'स्थिति' = 2 है, लेकिन वास्तविक राशि' स्थिति = 2' के साथ पहली पंक्ति के बीच होनी चाहिए और 'स्थिति = 1' – Fabio

संबंधित मुद्दे