痛いでしょう。非常に痛いです。
この問題に関するあなたの質問は明確ではありませんが、あなたが参照している「ユーザー ID」はユーザー名であると想定しています。それが間違っている場合は、必然的な修正が必要です。
複雑なクエリと同様に、段階的に構築します。
ステージ 1: レコードごとに null 以外のフィールドがいくつあるか?
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: 最大数の非 null フィールドを持つ特定のユーザーの行を (すべて) 選択します。
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;
ここで、(たとえば) 3 つのフィールドすべてが入力された複数の行がある場合、それらすべての行が返されます。ただし、これらの行から選択する基準を指定していません。
ここでの基本的なテクニックは、変更された要件に適応させることができます。重要なのは、サブクエリを作成してテストすることです。
この SQL はいずれも DBMS に近いものではありません。バグが含まれている可能性があります。
使用している DBMS を指定していません。ただし、オラクルはテーブルの別名に使用される AS 表記を好まないようですが、列の別名の AS には問題はありません。他の DBMS を使用している場合は、そのようなちょっとした偏心について心配する必要はありません。