2014-08-29 5 views
6

मैं क्वेरी के नीचे का उपयोग हर क्षेत्रढूँढना माध्य तालिका में हर तारीख तक

SELECT DISTINCT Sector, 
    PERCENTILE_DISC(0.5) WITHIN 
GROUP (ORDER BY Value) OVER (PARTITION BY sector) AS Median 
FROM TABLE 

तालिका के लिए औसत लगाने के लिए

Sector Date Value 
    A 2014-08-01 1 
    B 2014-08-01 5 
    C 2014-08-01 7 
    A 2014-08-02 6 
    B 2014-08-02 5 
    C 2014-08-02 4 
    A 2014-08-03 3 
    B 2014-08-03 9 
    C 2014-08-03 6 
    A 2014-08-04 5 
    B 2014-08-04 8 
    C 2014-08-04 9 
    A 2014-08-05 5 
    B 2014-08-05 7 
    C 2014-08-05 2 

तो मैं मिलता प्रारूप नीचे में है उम्मीद परिणाम

Sector Median 
    A 5 
    B 7 
    C 6 

अब मुझे प्रक्रिया को बदलने की जरूरत है जैसे कि मध्यस्थों की गणना केवल तभी होती है दिए गए दिनांक तक रिकॉर्ड रिंग करें। तो नया परिणाम

Sector Date Value 
    A 2014-08-01 1 
    B 2014-08-01 5 
    C 2014-08-01 7 (Only 1 record each was considered for A, B and C) 

    A 2014-08-02 3.5 
    B 2014-08-02 5 
    C 2014-08-02 5.5 (2 records each was considered for A, B and C) 

    A 2014-08-03 3 
    B 2014-08-03 5 
    C 2014-08-03 6 (3 records each was considered for A, B and C) 

    A 2014-08-04 4 
    B 2014-08-04 6.5 
    C 2014-08-04 6.5 (4 records each was considered for A, B and C) 

    A 2014-08-05 5 
    B 2014-08-05 7 
    C 2014-08-05 6 (All 5 records each was considered for A, B and C) 

तो यह एक संचयी औसत होगा। क्या कोई मुझे बता सकता है कि इसे कैसे प्राप्त किया जाए। मेरी तालिका में करीब 1100 तिथियों के लिए लगभग 1100 रिकॉर्ड के साथ लगभग 2.3 एम रिकॉर्ड हैं।

कृपया अगर आप किसी भी जानकारी की आवश्यकता है मुझे पता है।

उत्तर

1

यह मुश्किल बनाता है यही कारण है, क्योंकि निम्नलिखित काम नहीं करता:

SELECT DISTINCT Sector, Date, 
     PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY Value) OVER (PARTITION BY sector ORDER BY DATE) AS Median 
FROM TABLE; 

आह। आप इस उद्देश्य के लिए cross apply उपयोग कर सकते हैं:

select t.sector, t.date, t.value, m.median 
from table t cross apply 
    (select top 1 PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY t2.Value) OVER (PARTITION BY sector ORDER BY t2.DATE) AS Median 
     from table t2 
     where t2.sector = t.sector and t2.date <= t.date 
    ) m; 
+0

प्रिय महोदय, धन्यवाद। ऐसा लगता है कि मेरे टेस्ट डेटासेट में अच्छा काम कर रहा है। अब मैं इसे विशाल टेबल के खिलाफ चला रहा हूं। आइए उम्मीद है कि सब ठीक हो जाएंगे। आपकी मदद के लिए बहुत बहुत धन्यवाद। – John

2

एक और तरीका है हर दिन के लिए सभी पिछले मूल्य मिलता है और उपयोग करने के लिए एक त्रिकोणीय JOIN बनाने के लिए है कि के रूप में डेटा

;With T AS (
    SELECT t2.Sector, t2.[Date], t1.[Value] 
    FROM Table1 t1 
     LEFT JOIN Table1 t2 ON t1.Sector = t2.Sector and t1.[Date] <= t2.[Date] 
) 
SELECT DISTINCT Sector 
    , [Date] 
    , PERCENTILE_CONT(0.5) 
     WITHIN GROUP (ORDER BY [Value]) 
     OVER (PARTITION BY sector, [Date]) AS Median 
FROM T 
ORDER BY [Date], Sector; 

SQLFiddle demo

क्वेरी में मैं मूल्यों की भी संख्या के मामले में सही मंझला पाने के लिए PERCENTILE_CONT साथ PERCENTILE_DISC बदल दिया है, उदाहरण के लिए दूसरा दिन।

+0

प्रिय महोदय, आपके उत्तर के लिए धन्यवाद। मैंने अपना PERCENTILE_DISC PERCENTILE_CONT बदल दिया है – John

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