具有不同标志的相同密钥
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?
分两步完成:
- 将具有两个值的每个键的其中一行中的标志替换为
Mixed
。
- 删除具有
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
列的值
只有单值或双值
我有一个 table 作为输入,如下所示:
Key | Flag |
---|---|
123 | Yes |
123 | No |
567 | No |
876 | Yes |
当我在 Flag 字段中有两个具有不同值的相同键时,我只想保留一个带有 Flag = Mixed 的键
期望输出
Key | Flag |
---|---|
123 | Mixed |
567 | No |
876 | Yes |
你能帮我弄清楚吗,使用SQL?
分两步完成:
- 将具有两个值的每个键的其中一行中的标志替换为
Mixed
。 - 删除具有
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
列的值