如何解决MySQL获得与每个唯一列值匹配的n%的行
使用10.3.17-MariaDB
,我试图获得与特定列中每个唯一值匹配的行的50%。使用下面的示例,对于每个唯一的代码,我希望获得包含该代码的所有行的50%。
假设我的桌子是这样的
Name Code
A 200
B 300
C 300
D 400
E 400
F 400
G 400
例如,注意B和C的代码为300,而D,E,F,G的代码均为400。
查询所需的输出:
Name Code
A 200 < 1 of 1
B 300 < 1 of 2
D 400 < 1 of 4
E 400 < 2 of 4
更新:所选答案提供了正确的结果。对问题进行了轻描淡写,以使其更加清晰。
解决方法
使用ROW_NUMBER()
和COUNT()
窗口功能:
with cte as (
select *,row_number() over (partition by code order by name) rn,count(*) over (partition by code) counter
from tablename
)
select Name,Code
from cte
where rn <= ceiling(counter * 0.50)
使用ceiling()
,当code
的行数为奇数时,您将再获得1行(例如,如果有5行,则结果将为3)。
如果您不想将此更改为:
where rn <= counter * 0.50 or rn = 1
请参见demo。
结果:
> Name | Code
> :--- | ---:
> A | 200
> B | 300
> D | 400
> E | 400
,
您可以为每组代码分配一个行号,然后与计数进行比较
WITH CTE AS
(SELECT NAME,CODE,ROW_NUMBER() OVER(PARTITION BY CODE ORDER BY NAME) rN FROM T
)
SELECT *
FROM CTE
WHERE CTE.RN <= (select count(*) / 2 from t where t.code = cte.code group by code) or
cte.rn = (select count(*) from t where t.code = cte.code group by code having count(*) = 1);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。