具有不同标志的相同密钥

Same key with different flags

我有一个 table 作为输入,如下所示:

Key Flag
123 Yes
123 No
567 No
876 Yes

当我在 Flag 字段中有两个具有不同值的相同键时,我只想保留一个带有 Flag = Mixed 的键

期望输出

Key Flag
123 Mixed
567 No
876 Yes

你能帮我弄清楚吗,使用SQL?

分两步完成:

  1. 将具有两个值的每个键的其中一行中的标志替换为 Mixed
  2. 删除具有 Mixed 标志的键的另一行。
UPDATE yourTable AS t1
JOIN yourTable AS t2 ON t1.key = t2.key
SET t1.flag = 'Mixed'
WHERE t1.flag = 'Yes' AND t2.flag = 'No';

DELETE t1 
FROM yourTable AS t1
JOIN yourTable AS t2 ON t1.key = t2.key
WHERE t1.flag = 'No' AND t2.flag = 'Mixed';

第一个查询将每对中的 Yes 替换为 Mixed,第二个查询删除相应的 No 行。

围绕此设置事务,使其成为原子事务。

假设您只想在查询中获得此输出而不是更改 table,您可以使用 group_concat() 函数。这会将您的不同标志放入带有逗号分隔符的一列中。然后,您可以将其放入 case 语句中以获得所需的输出。

select `key`,

        group_concat(flag) flag

from temp_db.table

group by `key`
Key Flag
123 Yes, No
select `key`

      ,case when flag = 'Yes, No' then 'Mixed'

            else flag end as flag

from (select `key`,

      group_concat(flag) flag

      from temp_db.table

      group by `key`)

一个选项是使用条件 select 查询从这个 table 创建一个新的 table,并将新的 table 重命名为当前的 table(即 t1) 在删除 table 之后添加主键约束,例如

CREATE TABLE t2 AS
SELECT `Key`, CASE WHEN COUNT(`Key`)=2 THEN 'Mixed' ELSE MAX(Flag) END AS Flag
  FROM t1
 GROUP BY `Key`;

DROP TABLE t1;

RENAME TABLE t2 TO t1;

ALTER TABLE t1 ADD PRIMARY KEY(`Key`);

假设整个 table 中的数据对于每个 Key 列的值

只有单值或双值

Demo