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 |