Mysql 获取具有特定重复值的行
我有一个没有主键的表,如下所示:Mysql 获取具有特定重复值的行,mysql,sql,oracle,Mysql,Sql,Oracle,我有一个没有主键的表,如下所示: NotId Status 1 active 1 inactive 2 active 3 inactive 4 inactive 5 active 5 inactive 5 extended 6 inactive 6 extended 我想把桌子上所有的notid都拿出来。如果发现重复的NOTID,则只应返回状态为active的NOTID。应跳过具有其他状态的重
NotId Status
1 active
1 inactive
2 active
3 inactive
4 inactive
5 active
5 inactive
5 extended
6 inactive
6 extended
我想把桌子上所有的notid都拿出来。如果发现重复的NOTID,则只应返回状态为active的NOTID。应跳过具有其他状态的重复NOTID。如果状态为活动的NOTID不存在,则应返回所有副本。请注意,状态不限于活动和非活动 预期结果:
1 active
2 active
3 inactive
4 inactive
5 active
6 inactive
6 extended
将分组与
min
as一起使用
select NotId, min(Status) as Status
from tab
where Status in ('active','inactive')
group by NotId
状态为('active','inactive')
取决于注释
“应跳过具有其他状态的重复NotId”为每个NotId返回一行。使用
coalesce
结合case
表达式返回“active”(如果存在),否则返回其他值
select NotId,
coalesce(min(case when Status = 'active' then Status end), min(Status)) as Status
from tab
group by NotId
jarlh解决方案效果很好,但如果您想删除组大于1且没有活动组的行,则需要先做一些工作
SELECT `NotId`, CASE WHEN total = 1
THEN result
WHEN active > 0
THEN 'active'
END as `Status`
FROM ( SELECT `NotId`,
MAX(`Status`) as result,
COUNT(*) as total,
COUNT( CASE WHEN `Status` = 'active' THEN 1 END) as active
FROM Table1
GROUP BY `NotId`
) as T
WHERE total = 1 or active = 1;
此查询满足一个规范。(该规范可能不同于问题中给出的用例所需的规范。) 鉴于:
INSERT INTO mytable (notid, status) VALUES
('1','active')
,('1','inactive')
,('2','active')
,('3','inactive')
,('4','fee')
,('4','fi')
,('4','fo')
,('4','fum')
,('5','active')
,('5','active')
,('5','inactive')
;
查询返回:
notid status
----- ------
1 active
2 active
3 inactive
4 fee
4 fi
4 fo
4 fum
5 active
5 active
此查询假定notid
为非空。这将返回表中的所有行,包括重复的行,不包括状态为“活动”的行,如果给定的notid存在状态为“活动”的行,则不包括状态为“活动”的行
select tab.*
from tab inner join (
select NotId, concat(',', group_concat(Status), ',') like '%,active,%' active
from tab
group by NotId
) t
on t.NotId = tab.NotId
where
t.active = 0
or
(t.active = 1 and tab.Status = 'active')
请参见
结果
| NotId | Status |
| ----- | -------- |
| 1 | active |
| 2 | active |
| 3 | inactive |
| 4 | inactive |
| 5 | active |
| 6 | inactive |
| 6 | extended |
同时指定期望的结果,使用该表数据!结果应该同时包含('5','active')
行,还是只包含一个重复行?提供预期结果有助于说明规范。(返回指定结果集所需的查询取决于规范。)(问题已被修改…如果有另一行,('5','active')
…和另一行,('5','active')
“请注意,状态不限于活动和非活动。”。如果一个NotId没有活动行,而是另外两行呢?如果这些其他行具有相同的状态,是否都应返回?如果这些其他行具有不同的状态,是否都应返回?您使用的是MySQL还是Oracle?您必须解释重复部分。例如,如果3有另一个非活动,则结果中将显示?“请注意,状态不限于活动和非活动”您必须更改为其中状态为('Active','Inactive')
@forpas为什么?他添加了“应跳过具有其他状态的重复NotId”…NotId
是整数id
| NotId | Status |
| ----- | -------- |
| 1 | active |
| 2 | active |
| 3 | inactive |
| 4 | inactive |
| 5 | active |
| 6 | inactive |
| 6 | extended |