【问题标题】:Assign pid based on 4 columns match根据 4 列匹配分配 pid
【发布时间】:2023-02-20 23:24:12
【问题描述】:

我有一个包含以下几列的表格。

输入:

| PID      | Column A || Column B | Column C || Column D | GID      |
| -------- | -------- || -------- | -------- || -------- | -------- |
|          | 123      || abc      | xyz      || 1        | 0001     |
|          | 123      || abc      | cfd      || 1        | 0002     |
|          | 321      || abc      | cfd      || 1        | 0003     |
|          | 321      || cba      | dfs      || null     | 0004     |
|          | 234      || ert      | rte      || 2        | 0005     |
|          | 456      || ter      | rte      || 2        | 0006     |
|          | 123      || bbv      | cfd      || 1        | 0007     |
|          | 567      || bbv      | tre      || null     | 0008     |

我需要输出格式如下。 每当我看到 4 个标识符中的任何一个匹配时,我需要将相同的 PID 分配给下一行

输出:

| PID      | Column A || Column B | Column C || Column D | GID      |
| -------- | -------- || -------- | -------- || -------- | -------- |
|    0001  | 123      || abc      | xyz      || 1        | 0001     |
|    0001  | 123      || abc      | cfd      || 1        | 0002     |
|    0001  | 321      || abc      | cfd      || 1        | 0003     |
|    0001  | 321      || cba      | dfs      || null     | 0004     |
|    0005  | 234      || ert      | rte      || 2        | 0005     |
|    0005  | 456      || ter      | rte      || 2        | 0006     |
|    0001  | 123      || bbv      | cfd      || 1        | 0007     |
|    0001  | 567      || bbv      | tre      || null     | 0008     |

对于第 2 行,因为它具有相同的 A 列和 B,D 它分配了相同的 PID 与第 3 行类似,它具有相同的列 B、C 和 D 对于第 4 行,我有相同的 COl A 等等。

有人可以帮助在雪花中创建查询以获得所需的输出。谢谢。

我试过创建 cte 但它没有解决目的。有什么办法可以做到这一点。

代码 sn-p:这适用于第一次迭代。希望它递归地对整个数据集起作用。

with cte_1 as
(
select distinct Column B,pid_ori
from my_table ec
join (select distinct Column A,first_value(person_id) over(partition by Column A order by start_datetime)  pid_ori
from my_table
)a
on a.Column A=ec.Column A
)
,
cte_2 as
(
select  ec.Column A,ec.Column B,pid_ori,ec.Column C
from my_table ec
join cte_1
on ec.Column B = cte_1.Column B
)
,
cte_3 as
(
select  fp.Column A Column A, fp.Column B Column B,pid_ori,fp.Column C Column C,fp.Column D
,fp.start_datetime
from my_table fp
join cte_2 ec
on ec.Column C = fp.Column C
)
select distinct pid_ori,Column A,Column B,Column C
from  cte_Column C

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    试试这个解决方案。

    WITH RECURSIVE cte AS (
      SELECT
        ROW_NUMBER() OVER (ORDER BY GID) AS row_num,
        PID,
        ColumnA,
        ColumnB,
        ColumnC,
        ColumnD,
        GID
      FROM input_table
      WHERE PID IS NULL
      UNION ALL
      SELECT
        c.row_num,
        COALESCE(c.PID, p.PID) AS PID,
        p.ColumnA,
        p.ColumnB,
        p.ColumnC,
        p.ColumnD,
        p.GID
      FROM cte c
      JOIN input_table p
        ON (c.ColumnA = p.ColumnA OR c.ColumnB = p.ColumnB OR c.ColumnC = p.ColumnC OR c.ColumnD = p.ColumnD)
        AND c.GID <> p.GID
    )
    SELECT
      PID,
      ColumnA,
      ColumnB,
      ColumnC,
      ColumnD,
      GID
    FROM cte
    ORDER BY GID;
    
    

    注意:此查询假定 PID 列最初为空,并将新的 PID 分配给每组匹配行。如果 PID 列已经包含值,您将需要修改查询以使用现有的 PID 而不是分配新的 PID。

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 2020-10-28
      • 2021-08-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多