2013-06-25 16 views
15

द्वारा मैं इस तरह एक मेज है,अंतराल समारोह और ग्रुप

event_id |   date   
----------+------------------------ 
    1703702 | 2013-06-25 07:50:57-04 
    3197588 | 2013-06-25 07:51:57-04 
60894420 | 2013-06-25 07:52:57-04 
60894420 | 2013-06-25 07:53:57-04 
    183503 | 2013-06-25 07:54:57-04 
63116743 | 2013-06-25 07:55:57-04 
63110451 | 2013-06-25 07:56:57-04 
63116743 | 2013-06-25 07:57:57-04 
63116743 | 2013-06-25 07:58:57-04 

मैं तो मैं किसी विशेष event_id के बीच समय अंतराल पा सकते हैं द्वारा अंतराल समारोह लेकिन यह भी एक समूह लागू करना चाहते हैं।

SELECT event_id, difference 
FROM ( 
    SELECT event_id, date - lag(date) over (order by date) as 
    difference FROM table GROUP BY event_id 
) t; 

मैं तथापि अंतराल समारोह के साथ ग्रुप द्वारा उपयोग नहीं कर सकते:

मैं कुछ इस तरह करना चाहते हैं। मैं एक परिणाम निम्न के समान करना चाहते हैं:

63116743, {120, 60} 
60894420, {60} 
... 
... 

तो वहाँ पहले आईडी के लिए घटनाओं के बीच एक 120S और 60 के दशकों खिड़की, और दूसरा आईडी के लिए एक 60 के दशक खिड़की थी।

क्या ऐसा करने का कोई तरीका है? आउटपुट प्रारूप तब तक बहुत महत्वपूर्ण नहीं है जब तक कि मैं इसे अंत में एक सरणी में प्राप्त कर सकूं। मैं पोस्टग्रेज़ का उपयोग कर रहा हूं 9.1

+0

क्षमा करें, लेकिन मुझे समझ में नहीं आता कि आउटपुट का क्या अर्थ है। 120? 60? किस? यह आपके द्वारा दिखाए गए डेटा से नहीं दिखता है। –

+0

आपके प्रश्न में उप-चयन क्वेरी में कुछ भी नहीं जोड़ रहा है - आप प्रभावी रूप से 'चयन *' कर रहे हैं, जो आंतरिक क्वेरी को चलाने के समान है। – IMSoP

+0

@depesz \t यह सेकेंड में व्यक्त अंतराल है: '2013-06-25 07: 55: 57-04' और '2013-06-25 07: 57: 57-04' के बीच 120s, उसके बाद 60 और उसके बीच 60 ' -06-25 07: 58: 57-04 ', केवल एक ही आईडी के साथ घटनाओं की तुलना। – IMSoP

उत्तर

19
WITH diffs as (
    SELECT 
     event_id, 
     date - lag(date) over (partition BY event_id ORDER BY date) as difference 
    FROM 
     TABLE 
) 
SELECT 
    event_id, 
    array_agg(difference) as all_diffs 
FROM 
    diffs 
GROUP BY event_id; 

काम करना चाहिए।

+0

और यहां यह साबित करने के लिए एक SQLFiddle है: http://www.sqlfiddle.com/#!1/c22fc/4 ('array_agg' किसी कारण से SQLFiddle को तोड़ने लगता है, इसलिए मैंने परिणाम देखने के लिए 'string_agg' का उपयोग किया) – IMSoP

+1

ओह, और सेकंड में व्यक्त करने के लिए, 'एक्स्ट्राक्ट (' युग 'से ...): http://www.sqlfiddle.com/#!1/c22fc/6 – IMSoP

+0

मैंने इस सवाल को गलत समझा और महत्वपूर्ण शामिल नहीं किया 'पक्ष द्वारा'; मैं इसे समझने के लिए SQLFiddle तैयार कर रहा था, लेकिन आप मुझे इसे हराया :) – IMSoP

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