查询数据表时如何仅取Value为A的前2条记录其余全量返回
实现方案
该需求可以用window窗口函数实现,也可以不用窗口函数,两种写法如下:
方案1:窗口函数实现(更简洁易维护)
用ROW_NUMBER()窗口函数按Value分组排序后做条件筛选即可,示例SQL如下(假设你的表名为test_table):
SELECT Name, Value FROM ( SELECT Name, Value, -- 按Value分组,按Name升序排序生成行号 ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Name) AS row_num FROM test_table ) tmp -- 筛选规则:非A的全部返回,A的只返回前2行 WHERE Value != 'A' OR row_num <= 2;
方案2:无窗口函数实现(兼容不支持窗口函数的低版本数据库)
用UNION ALL拼接两部分查询结果即可:
-- 取Value为A的前2条 SELECT Name, Value FROM test_table WHERE Value = 'A' ORDER BY Name LIMIT 2 UNION ALL -- 取Value不为A的全部记录 SELECT Name, Value FROM test_table WHERE Value != 'A' ORDER BY Name;
说明
- 两种写法最终返回的结果都和你期望的一致:
A返回前2条、B全量返回 - 如果后续需要调整不同
Value的返回条数,窗口函数的方案修改成本更低,不需要拆分多个子查询
内容的提问来源于stack exchange,提问作者ZZzzZZzz
相关产品推荐
相关产品推荐

