यह दर्दनाक होगा; बहुत दर्दनाक।
इस मुद्दे के बारे में आपका प्रश्न स्पष्ट नहीं है, लेकिन मुझे लगता है कि आप जिस 'यूजर आईडी' का जिक्र कर रहे हैं वह यूजर नेम है। यदि यह गलत है तो परिणामी संशोधन करने होंगे।
किसी भी जटिल क्वेरी की तरह, इसे चरणों में तैयार करें।
चरण 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 का उपयोग कर रहे हैं, तो आपको उस छोटी सी विलक्षणता के बारे में चिंता करने की आवश्यकता नहीं है।