मैं एक संग्रहीत प्रक्रिया बनाने की कोशिश कर रहा हूं जो अस्थायी तालिका में कुछ स्तंभों के बीच सहसंबंधों की गणना करता है।

मेरे पास एक प्रश्न है जो नीचे की तरह एक अस्थायी तालिका उत्पन्न करता है,

 Date         USA     JAPAN    FRANCE   UK 
 2018-01-01   5       3.2      1.6      2.8
 2018-01-02   6.8     8.2      0.9      3.5
 2018-01-03   4.3     6.2      3.3      2.1
 2018-01-04   3.9     6.2      4.5      7.8
 ...
 2018-01-31   7.6     5.1      4.7      5.1

मैं सभी स्तंभों के बीच सहसंबंधों की गणना करना चाहता हूं। नीचे दी गई क्वेरी ठीक यही करती है।

SELECT 
(Avg(SeriesA * SeriesB) - (Avg(SeriesA) * Avg(SeriesB))) / (StDevP(SeriesA) * StDevP(SeriesB))  
FROM myTempTbl

हालाँकि मेरी अस्थायी तालिका में स्तंभों की संख्या बदल सकती है, अर्थात किसी अन्य देश को जोड़ा या हटाया जा सकता है आदि

नीचे दिए गए आउटपुट परिणामों के लिए सभी कॉलम के बीच सहसंबंध की गणना करने का सबसे अच्छा तरीका क्या है?

मुझे जो परिणाम चाहिए वह नीचे जैसा कुछ है (सहसंबंध बना हुआ है),

    Country1  Country2   Correlation
    USA       JAPAN      0.1
    USA       FRANCE     0.1
    USA       UK         0.1
    JAPAN     FRANCE     0.1
    JAPAN     UK         0.1
    FRANCE    UK         0.1
1
mHelpMe 23 अक्टूबर 2018, 16:02

2 जवाब

सबसे बढ़िया उत्तर

मुझे संदेह है कि आप यही कर रहे हैं, हालांकि, मुझे जो परिणाम मिलते हैं, वे आपके मेल नहीं खाते (मुझे प्रत्येक पंक्ति के लिए सहसंबंध के लिए मूल्य 0 मिलता है) ऐसा इसलिए हो सकता है क्योंकि आपका नमूना डेटा बहुत अधिक डेटा का तात्पर्य है (जो आप आपूर्ति नहीं की है, इस प्रकार आपके प्रश्न में अपेक्षित परिणाम आपूर्ति किए गए नमूना डेटा का प्रतिनिधि नहीं है)। हालाँकि, यह आपको कम से कम सही दिशा में धकेलना चाहिए:

CREATE TABLE CountryData (DataDate date,
                          Country varchar(15),
                          SomeDecimal decimal(2,1)); --No idea what this represents

WITH VTE AS(
    SELECT *
    FROM (VALUES('20180101',5  ,3.2,1.6,2.8),
                ('20180102',6.8,8.2,0.9,3.5),
                ('20180103',4.3,6.2,3.3,2.1),
                ('20180104',3.9,6.2,4.5,7.8),
                ('20180131',7.6,5.1,4.7,5.1)) V([Date],USA,JAPAN,FRANCE,UK))
--Pivot the data. This is not dynamic, I am simply showing you what you need to data to look like.
--It was far quicker for me to take your existing data and pivot it, than transcribe it all in Normal Form
INSERT INTO CountryData
SELECT V.[Date],
       C.Country,
       CASE C.Country WHEN 'USA' THEN USA
                      WHEN 'JAPAN' THEN JAPAN
                      WHEN 'FRANCE' THEN FRANCE
                      WHEN 'UK' THEN UK
       END AS SomeDecimal
FROM VTE V
     CROSS APPLY (VALUES('USA'),('JAPAN'),('FRANCE'),('UK')) C(Country);
GO
--How your data should look
SELECT *
FROM CountryData;
GO
--And now the (much simpler) non-dynamic solution
SELECT CDa.Country AS Country1,
       CDb.Country As Country2,
       (Avg(CDa.SomeDecimal * CDb.SomeDecimal) - (Avg(CDa.SomeDecimal) * Avg(CDb.SomeDecimal))) / (StDevP(CDa.SomeDecimal) * StDevP(CDb.SomeDecimal)) AS Correlation
FROM CountryData CDa
     JOIN CountryData CDb ON CDa.Country != CDb.Country
GROUP BY CDa.Country, CDb.Country
ORDER BY CDa.Country, CDb.Country;

GO
DROP TABLE CountryData;
2
Larnu 23 अक्टूबर 2018, 13:40

चुनें (औसत (x * y) - (औसत (x) * औसत (y))) / (StDevP (x) * StDevP (y)) 'सहसंबंध' के रूप में

0
Mohamed Magdi 11 पद 2020, 00:06