【问题标题】:Create unique identifier for more persons that are the same (SQL)为更多相同的人创建唯一标识符 (SQL)
【发布时间】:2017-08-22 09:43:47
【问题描述】:

我有两张桌子:

|-------------|   |-------------|
| Person      |   | Alias       |
|-------------|   |-------------|
| person_id   |   | person_id_1 |   
| person_name |   | person_id_2 |
|-------------|   |-------------|

别名表告诉我两个人是否实际上是同一个人。如果是这种情况,我想为这些人提供一个唯一的 ID。

E. G。: |-------------------------| | Person | |-----------|-------------| | person_id | person_name | |-----------|-------------| | 1 | Michail | |-----------|-------------| | 2 | Michail | |-----------|-------------| | 3 | Petja | |-----------|-------------|

|---------------------------| | Alias | |-------------|-------------| | person_id_1 | person_id_2 | |-------------|-------------| | 1 | 2 | |-------------|-------------|

现在我想创建一个视图、查询,你可以命名它,它列出了我所有的 person_id 和这些 id 的唯一标识符。

|-----------------------|
| Unique ID View        |
|-----------------------|
| unique_id | person_id |
|-----------------------|
| xe3rf     | 1         |
| xe3rf     | 2         |
| y23ij     | 3         |
|-----------------------|

有人可以帮助我查看唯一 ID 视图吗?我完全不知道atm :-(

感谢inb4,

迈克尔

【问题讨论】:

  • 同一个人是否有可能在同一张桌子上超过两次?
  • 是的。这是kissmetrics数据。一个人可以通过会话 ID 或您分配给他的任何其他标识符来识别。有时你会在一段时间后首先知道两个人是同一个人。然后填写 Alias 表。

标签: sql postgresql kissmetrics


【解决方案1】:

我认为您已经有了一个可用于 uniqe id 的值。您只需要强制 person_id_1 在同一个人上是唯一的。确保您没有树状引用:

1 -> 2
2 -> 3
2 -> 4

这些树状连接通常很难在 SQL 中处理。

让我们将person_id_1 重命名为original_id 并将person_id_2 重命名为secondary_id。如果你找到一个新的连接,说“5 与 3 重复”,查询表:

  • original_id 列上是否存在 3?如果是,请插入新连接。
  • secondary_id 列上是否存在 3?如果是,查询该行的 original_id,并插入一个新的连接。

这样可以避免连锁,你想要的查询就这么简单

select * from Alias 

正如@a_horse_with_no_name 建议的那样,您也可以简单地使用带有RECURSIVE WITH 语句的查询:

WITH RECURSIVE conn(person_id_1, person_id_2) AS (
    SELECT person_id_1, person_id_2 from Alias
  UNION ALL
    SELECT Alias.person_id_1, conn.person_id_2
    FROM Alias, conn
    WHERE Alias.person_id_2 = conn.person_id_1
),
leaf_nodes AS (
  select distinct person_id_2 from Alias
)
select * 
from conn
where conn.person_id_1 NOT IN (select person_id_2 from leaf_nodes)
order by person_id_1;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多