2014-04-14 11 views
22

मेरे पास निम्न तालिका है, जो प्रत्येक उपयोगकर्ता के लिए एकाधिक ईमेल पते देती है।पोस्टग्रेर्स - स्तंभों को पंक्तियों को स्थानांतरित करें

enter image description here

मैं इस उपयोगकर्ता क्वेरी पर स्तंभों के लिए बाहर समतल करने की जरूरत है। निर्माण तिथि के आधार पर मुझे "नवीनतम" 3 ईमेल पते देने के लिए।

user.name | user.id | email1   | email2   | email3** 

Mary  | 123  | [email protected] | [email protected] | [email protected] 

Joe  | 345  | [email protected] | [NULL]   | [NULL] 

उत्तर

33

tablefunc मॉड्यूल से उपयोग crosstab()

SELECT * FROM crosstab(
    $$SELECT user_id, user_name, rn, email_address 
    FROM (
     SELECT u.user_id, u.user_name, e.email_address 
      , row_number() OVER (PARTITION BY u.user_id 
          ORDER BY e.creation_date DESC NULLS LAST) AS rn 
     FROM usr u 
     LEFT JOIN email_tbl e USING (user_id) 
     ) sub 
    WHERE rn < 4 
    ORDER BY user_id 
    $$ 
    , 'VALUES (1),(2),(3)' 
    ) AS t (user_id int, user_name text, email1 text, email2 text, email3 text); 

मैंने पहले पैरामीटर के लिए डॉलर-उद्धरण का उपयोग किया, जिसका कोई विशेष अर्थ नहीं है। यह सिर्फ सुविधाजनक है आप क्वेरी स्ट्रिंग जो एक आम मामला है में एकल उद्धरण से बचने के लिए है, तो:

विस्तृत विवरण और निर्देश यहाँ:

और विशेष रूप से, "अतिरिक्त कॉलम" के लिए:

विशेष कठिनाइयों यहां हैं:

  • प्रमुख नामों की कमी है।
    -> हम एक सबक्वायरी में row_number() के साथ प्रतिस्थापित करते हैं।

  • ईमेल की अलग-अलग संख्या।
    -> हम अधिकतम तक सीमित हैं। बाहरी SELECT
    में से तीन और crosstab() का उपयोग दो पैरामीटर के साथ करें, संभावित कुंजी की एक सूची प्रदान करते हैं।

NULLS LAST in the ORDER BY पर ध्यान दें।

+2

सही, thankyou। वास्तव में मुझे क्या चाहिए। यह सवाल मुझसे परे थोड़ा सा होता, लेकिन मुझे सीखने और समझने में मदद मिली है। – dacology

+0

उन कुछ आश्चर्यजनक के लिए। नहीं, यह एडब्ल्यूएस रेडशिफ्ट पर काम नहीं करता है। –

+0

@MarcelloGrechiLins: यह क्यू एंड ए पोस्टग्रेज़ के लिए हैं, रेडशिफ्ट नहीं। –

8

कि इस प्रश्न पाता है और यह है जहाँ आप स्तंभों की अपरिभाषित संख्या है के लिए एक गतिशील समाधान की जरूरत है किसी और को स्थानांतरित करने के लिए और वास्तव में 3 नहीं, तो आप एक अच्छा समाधान यहां पा सकते हैं, तो: https://github.com/jumpstarter-io/colpivot

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