SQLCTEは同じテーブルの行を比較します

user2793572

さまざまなデータソースの顧客のテーブルがあります。SSN、License#、およびいくつかの一意のIDがありますが、すべてのソースが同じIDを持っているわけではありません。ID列(SSN、ライセンス、SystemID)のレコードを比較し、同じ人物が見つかった場合はマップされたIDを割り当てたいと思います。

CTEは使用できると思いますが、どこから始めればよいかわかりません。まだSQLで自分のやり方を学ぼうとしています。どんな助けでもありがたいです。ありがとう。

テーブルの外観は次のとおりです。

Source|RowID|SSN |License|SystemID
A     |1    |SSN1|Lic111 |
A     |2    |    |       |Sys666
B     |3    |SSN2|       |Sys777
C     |4    |SSN1|       |
D     |5    |    |Lic333 |
D     |6    |    |Lic333 |Sys666
E     |7    |    |       |Sys777

結果(MapCustomerIDを追加)

Source|RowID|SSN |License|SystemID|MapCustomerID
A     |1    |SSN1|Lic111 |        |1
A     |2    |    |       |Sys666  |2
B     |3    |SSN2|       |Sys777  |3
C     |4    |SSN1|       |        |1
D     |5    |    |Lic999 |        |4
D     |6    |    |Lic333 |Sys666  |2
E     |7    |    |       |Sys777  |3
ゴードン・リノフ

これが、問題に対する「十分な」アプローチである可能性があるものです。

3つのディメンションのそれぞれに沿って、そのディメンションの最小行IDを見つけます(NULLの特別な処理を使用)。その場合、全体的な顧客IDは、これら3つのIDの最小値になります。ギャップなしでシーケンシャルにするには、を使用しますdense_rank()

with ids as (
      select t.*,
             (case when SSN is not null
                   then min(RowId) over (partition by SSN)
              end) as SSN_id,
             (case when License is not null
                   then min(RowId) over (partition by License)
              end) as License_id,
             (case when SystemId is not null
                   then min(RowId) over (partition by SystemId)
              end)as SystemId_id
      from t
     ),
     leastid as (
      select ids.*,
             (case when SSN_Id <= coalesce(License_Id, SSN_Id) and
                        SSN_Id <= coalesce(SystemId_id, SSN_Id)
                   then SSN_Id
                   when License_Id <= coalesce(SystemId_id, License_Id)
                   then License_Id
                   else SystemId_id
              end) as LeastId
      from ids
     )
select Source, RowID, SSN, License, SystemID,
       dense_rank(LeastId) over (order by LeastId) as MapCustomerId
from LeastIds;

これは完全なソリューションではありませんが、データに対しては機能します。次の場合は機能しません。

A     |1    |SSN1|Lic111 |        |1
A     |2    |SSN1|       |Sys666  |2
A     |3    |    |       |Sys666  |2

これには2つの「ホップ」が必要だからです。

過去にこの状況に直面したとき、テーブルに追加の列を作成updateし、さまざまなディメンションで最小IDを取得するために繰り返し使用しました。このような反復により、さまざまな部分がすばやく接続されます。同じことを行うために再帰CTEを作成することはおそらく可能です。ただし、上記のより簡単な解決策で問題が解決する場合があります。

編集:

以前にこの問題に直面したことがあるので、(更新を繰り返すのではなく)単一のクエリソリューションを考え出したかったのです。これは、再帰的なCTEを使用して可能です。動作しているように見えるコードは次のとおりです。

with t as (
    select 'A' as source, 1 as RowId, 'SSN1' as SSN, 'Lic111' as License, 'ABC' as SystemId union all
    select 'A', 2, 'SSN1', NULL, 'Sys666' union all
    select 'A', 3, NULL, NULL, 'Sys666' union all
    select 'A', 4, NULL, 'Lic222', 'Sys666' union all
    select 'A', 5, NULL, 'Lic222', NULL union all
    select 'A', 6, NULL, 'Lic444', NULL
   ),
    first as (
      select t.*,
             (select min(RowId)
              from t t2
              where t2.SSN = t.SSN or
                    t2.License = t.License or
                    t2.SystemId = t.SystemId
             ) as minrowid
      from t
   ),
   cte as (
    select rowid, minrowid
    from first
    union all
    select cte.rowid, first.minrowid
    from cte join
         first
         on cte.minrowid = first.rowid and
            cte.minrowid > first.minrowid
    ),
    lookup as (
      select rowid, min(minrowid) as minrowid,
             dense_rank() over (order by min(minrowid)) as MapCustomerId
      from cte
      group by rowid
    )

select t.*, lookup.MapCustomerId
from t join
     lookup
     on t.rowid = lookup.rowid;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Oracle SQLは、同じテーブルの行を比較します

分類Dev

sqlは同じテーブルの2つの一意の行を比較します

分類Dev

SQLは、属性を同じテーブル内の別の行の属性と比較します

分類Dev

TSQLは、同じ列の複数の行に基づいてテーブルを比較しますか?

分類Dev

SQLServerの同じテーブルの列を比較します

分類Dev

同じテーブルの2つの行の間で1つのフィールドを比較します

分類Dev

同じテーブル内の最新の行を直前の行と比較します

分類Dev

複数の行を比較して同じテーブルからデータを取得しますか?

分類Dev

同じ構造の2つのテーブルを比較するクエリを実行しますか?

分類Dev

同じ構造の2つのテーブルを比較するクエリを実行しますか?

分類Dev

同じテーブルSQLの2つの行を比較する

分類Dev

同じテーブルの行の値を比較する

分類Dev

同じテーブルの2行間のすべての列を比較します

分類Dev

同じ列と同じテーブルの対応する行を比較する

分類Dev

SQL Server2005の同じテーブルの複数の行を比較します

分類Dev

同じテーブルの行を比較する

分類Dev

同じテーブルの行を比較する

分類Dev

同じテーブルの2行を比較する方法

分類Dev

MySQLは同じテーブルの追加の行を選択します

分類Dev

列の集計を同じテーブルの別の列と比較します

分類Dev

SQL Serverは、同じテーブルの2つの行の値を比較し、一致しない列名を取得します

分類Dev

MS SQLCTEを使用して同じテーブル内の親から子にレコードをコピーする方法

分類Dev

OracleSQL-同じテーブル内のキーと値を比較します

分類Dev

SQL-同じテーブルの行を取得します

分類Dev

同じテーブルの2つを別のテーブルに結合し、同じ行の(同じ)テーブルの情報を出力します

分類Dev

列名は同じで集計されている2つのテーブルを比較します

分類Dev

同じテーブルの行をそれぞれのデフォルトの行と比較する方法は?

分類Dev

SQLServerは1つのテーブルの行を比較します

分類Dev

同じSQLテーブルの2つの行のデータを比較する

Related 関連記事

  1. 1

    Oracle SQLは、同じテーブルの行を比較します

  2. 2

    sqlは同じテーブルの2つの一意の行を比較します

  3. 3

    SQLは、属性を同じテーブル内の別の行の属性と比較します

  4. 4

    TSQLは、同じ列の複数の行に基づいてテーブルを比較しますか?

  5. 5

    SQLServerの同じテーブルの列を比較します

  6. 6

    同じテーブルの2つの行の間で1つのフィールドを比較します

  7. 7

    同じテーブル内の最新の行を直前の行と比較します

  8. 8

    複数の行を比較して同じテーブルからデータを取得しますか?

  9. 9

    同じ構造の2つのテーブルを比較するクエリを実行しますか?

  10. 10

    同じ構造の2つのテーブルを比較するクエリを実行しますか?

  11. 11

    同じテーブルSQLの2つの行を比較する

  12. 12

    同じテーブルの行の値を比較する

  13. 13

    同じテーブルの2行間のすべての列を比較します

  14. 14

    同じ列と同じテーブルの対応する行を比較する

  15. 15

    SQL Server2005の同じテーブルの複数の行を比較します

  16. 16

    同じテーブルの行を比較する

  17. 17

    同じテーブルの行を比較する

  18. 18

    同じテーブルの2行を比較する方法

  19. 19

    MySQLは同じテーブルの追加の行を選択します

  20. 20

    列の集計を同じテーブルの別の列と比較します

  21. 21

    SQL Serverは、同じテーブルの2つの行の値を比較し、一致しない列名を取得します

  22. 22

    MS SQLCTEを使用して同じテーブル内の親から子にレコードをコピーする方法

  23. 23

    OracleSQL-同じテーブル内のキーと値を比較します

  24. 24

    SQL-同じテーブルの行を取得します

  25. 25

    同じテーブルの2つを別のテーブルに結合し、同じ行の(同じ)テーブルの情報を出力します

  26. 26

    列名は同じで集計されている2つのテーブルを比較します

  27. 27

    同じテーブルの行をそれぞれのデフォルトの行と比較する方法は?

  28. 28

    SQLServerは1つのテーブルの行を比較します

  29. 29

    同じSQLテーブルの2つの行のデータを比較する

ホットタグ

アーカイブ