数据表结构如下:
想要得到A、B两组的所有抽检比例为0的值,并且要分别得到A、B两组抽检比例是非0值的最少的两个
结果如下所示:
时间暂时不用考虑,筛选后的排序无所谓,得到的值正确就行
我现在我的写法是:
分别SELECT 出A组和B组抽检比例非0的最少两个,再SELECT为0的,中间通过union all连接,想知道有没有更好的方式(代码少)来实现
(SELECT * FROM 表T WHERE `检查组`="A" AND `抽检比例` is not null ORDER BY `抽检比例` LIMIT 2)
union all
(SELECT * FROM 表T WHERE `检查组`="B" AND `抽检比例` is not null ORDER BY `抽检比例` LIMIT 2)
union all
(SELECT * FROM 表T WHERE `抽检比例` is null ORDER BY `抽检比例`)
这和你上一题不差不多么,
假如未来检查组增加的话,你这sql还得改,所以不建议sql里指定具体的值,使用开窗函数只需要对原表查一次就行了
select * from
(select t.*,row_number() over(partition by 检查组 order by if(isnull(抽检数,1,0)), 抽检比例) rn from 表T t) t1
where 抽检数 is null or rn<=2
表字段用中文名写的太麻烦了
SELECT
*
FROM
T AS a
WHERE
a.抽检数
is null
or (SELECT count(*) FROM T WHERE 检查组
= a.检查组
and 抽检比例
<a.抽检比例
AND 抽检数
IS NOT NULL)<2
ORDER BY
a.检查组