1

問題:

姓名が同じであるか、SSNが同じであるPersonテーブルで一致するレコードの数を見つけます。

ギブンズ

テーブル構造:

FirstName
LastName
SSN
RecordId

データ: Personテーブル

╔═══════════╦══════════╦═════════════╦══════════╗
║ FIRSTNAME ║ LASTNAME ║     SSN     ║ RECORDID ║
╠═══════════╬══════════╬═════════════╬══════════╣
║ Bob       ║ Smith    ║ 111-11-1111 ║        1 ║
║ Robert    ║ Smyth    ║ 111-11-1111 ║        2 ║
║ Bob       ║ Smith    ║ 222-22-2222 ║        3 ║
║ Tom       ║ Gunn     ║ 333-33-3333 ║        4 ║
║ Jim       ║ Gunn     ║ 444-44-4444 ║        5 ║
║ Jimmy     ║ Gunn     ║ 444-44-4444 ║        6 ║
║ Alice     ║ Jones    ║ 555-55-5555 ║        7 ║
║ Alice     ║ Jones    ║ 666-66-6666 ║        8 ║
╚═══════════╩══════════╩═════════════╩══════════╝

望ましい結果:

╔════════════╦═══════════╦══════════╦═════════════╦══════════╗
║ MATCHCOUNT ║ FIRSTNAME ║ LASTNAME ║     SSN     ║ RECORDID ║
╠════════════╬═══════════╬══════════╬═════════════╬══════════╣
║          3 ║ Bob       ║ Smith    ║ 111-11-1111 ║        1 ║
║          2 ║ Robert    ║ Smyth    ║ 111-11-1111 ║        2 ║
║          2 ║ Bob       ║ Smith    ║ 222-22-2222 ║        3 ║
║          1 ║ Tom       ║ Gunn     ║ 333-33-3333 ║        4 ║
║          2 ║ Jim       ║ Gunn     ║ 444-44-4444 ║        5 ║
║          2 ║ Jimmy     ║ Gunn     ║ 444-44-4444 ║        6 ║
║          2 ║ Alice     ║ Jones    ║ 555-55-5555 ║        7 ║
║          2 ║ Alice     ║ Jones    ║ 666-66-6666 ║        8 ║
╚════════════╩═══════════╩══════════╩═════════════╩══════════╝

私が試したこと

この問題を解決するために、GROUPBYとLEFTselfJOINの両方を使用してみました。

条件付きでグループ化する方法がないため、GROUPBYは失敗します。

LEFT self JOINは、一致数のほぼ2乗を返すため、失敗します。

私は自分の試みのコードを投稿しますが、実際のテーブルには多数の列があり、実際にははるかに複雑であり、ほぼ確実に問題がわかりにくくなります。

4

1 に答える 1

3

RDBMSについて言及していないので、これを試してください。

SELECT  COUNT(*) MatchCount,a.*
FROM    person a
        INNER JOIN person b
            ON  (a.firstname = b.firstname AND
                    a.lastname = b.lastname) OR
                    a.SSN = b.SSn
GROUP BY firstname, lastname, ssn, recordid
ORDER By recordid

結果

| MATCHCOUNT | 名| 姓| SSN | RECORDID |
-------------------------------------------------- ------------
| 3 | ボブ| スミス| 111-11-1111 | 1 |
| 2 | ロバート| スミス| 111-11-1111 | 2 |
| 2 | ボブ| スミス| 222-22-2222 | 3 |
| 1 | トム| ガン| 333-33-3333 | 4 |
| 2 | ジム| ガン| 444-44-4444 | 5 |
| 2 | ジミー| ガン| 444-44-4444 | 6 |
| 2 | アリス| ジョーンズ| 555-55-5555 | 7 |
| 2 | アリス| ジョーンズ| 666-66-6666 | 8 |

SQLフィドル

于 2013-01-15T01:12:57.840 に答える