PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एसक्यूएल:सबसे ज्ञात मूल्यों के साथ पंक्ति का चयन कैसे करें?

यह दर्दनाक होगा; बहुत दर्दनाक।

इस मुद्दे के बारे में आपका प्रश्न स्पष्ट नहीं है, लेकिन मुझे लगता है कि आप जिस 'यूजर आईडी' का जिक्र कर रहे हैं वह यूजर नेम है। यदि यह गलत है तो परिणामी संशोधन करने होंगे।

किसी भी जटिल क्वेरी की तरह, इसे चरणों में तैयार करें।

चरण 1:प्रति रिकॉर्ड कितने गैर-शून्य फ़ील्ड हैं?

SELECT username, sex, date_of_birth, zip,
       CASE WHEN sex           IS NULL THEN 0 ELSE 1 END +
       CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
       CASE WHEN zip           IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
  FROM users_log

चरण 2:किसी दिए गए उपयोगकर्ता नाम के लिए ऐसी अधिकतम फ़ील्ड कौन सी है?

SELECT username, MAX(num_non_null_fields) AS num_non_null_fields
  FROM (SELECT username, sex, date_of_birth, zip,
               CASE WHEN sex           IS NULL THEN 0 ELSE 1 END +
               CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
               CASE WHEN zip           IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
          FROM users_log
       ) AS u
 GROUP BY username

चरण 3:किसी दिए गए उपयोगकर्ता के लिए गैर-शून्य फ़ील्ड की अधिकतम संख्या वाली पंक्तियों का चयन करें:

SELECT u.username, u.sex, u.date_of_birth, u.zip
  FROM (SELECT username, MAX(num_non_null_fields) AS num_non_null_fields
          FROM (SELECT username, sex, date_of_birth, zip,
                       CASE WHEN sex           IS NULL THEN 0 ELSE 1 END +
                       CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
                       CASE WHEN zip           IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
                  FROM users_log
               ) AS u
         GROUP BY username
       ) AS v
  JOIN (SELECT username, sex, date_of_birth, zip,
               CASE WHEN sex           IS NULL THEN 0 ELSE 1 END +
               CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
               CASE WHEN zip           IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
          FROM users_log
       ) AS u
    ON u.username = v.username AND u.num_non_null_fields = v.num_non_null_fields;

अब, यदि किसी के पास कई पंक्तियाँ हैं (जैसे) तीनों फ़ील्ड भरे हुए हैं, तो उन सभी पंक्तियों को वापस कर दिया जाएगा। हालांकि, आपने उन पंक्तियों के बीच चयन करने के लिए कोई मानदंड निर्दिष्ट नहीं किया है।

यहां की बुनियादी तकनीकों को किसी भी परिवर्तित आवश्यकताओं के अनुकूल बनाया जा सकता है। कुंजी यह है कि जैसे ही आप जाते हैं उप-प्रश्नों का निर्माण और परीक्षण करना।

इनमें से कोई भी SQL DBMS के पास नहीं रहा है; इसमें बग हो सकते हैं।

आपने निर्दिष्ट नहीं किया है कि आप किस डीबीएमएस का उपयोग कर रहे हैं। हालांकि, ऐसा लगता है कि ओरेकल टेबल उपनामों के लिए उपयोग किए जाने वाले एएस नोटेशन को पसंद नहीं करेगा, हालांकि इसे कॉलम उपनामों पर एएस के साथ कोई समस्या नहीं है। यदि आप किसी अन्य DBMS का उपयोग कर रहे हैं, तो आपको उस छोटी सी विलक्षणता के बारे में चिंता करने की आवश्यकता नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं विंडोज़ पर पोस्टग्रेएसक्यूएल कैसे शुरू कर सकता हूं?

  2. PostgreSQL:डेटाबेस छोड़ें लेकिन DB अभी भी है

  3. टूटे हुए पीएल/रूबी के विकल्प:वेयरहाउस जर्नल टेबल को कनवर्ट करें

  4. मेरा सी प्रोग्राम गिट बैश में क्यों चल सकता है, लेकिन सीएमडी में नहीं?

  5. PostgreSQL विंडो फ़ंक्शंस शून्य मानों पर ध्यान न दें