如何编写SQL查询实现指定规则的表数据筛选?
如何用SQL实现特定的记录筛选需求?
嘿,我来帮你搞定这个SQL筛选的问题!先把你的需求和数据理清楚:
你有一张表,包含locationName、itemnumber、pickRouteOrder三个字段,原始数据如下:
| locationName | itemnumber | pickRouteOrder |
|---|---|---|
| loc1 | item1 | 10 |
| loc2 | item2 | 20 |
| loc2 | item3 | 20 |
| loc4 | item5 | 30 |
| no-loc | item6 | 99 |
| no-loc | item7 | 99 |
你的核心需求是:
- 当
locationName为no-loc时,保留所有对应的记录 - 当
locationName重复出现(比如loc2)时,仅保留该分组下的任意一条记录
期望得到的结果是:
| locationName | itemnumber | pickRouteOrder |
|---|---|---|
| loc1 | item1 | 10 |
| loc2 | item2 | 20 |
| loc4 | item5 | 30 |
| no-loc | item6 | 99 |
| no-loc | item7 | 99 |
通用解决方案(支持窗口函数的数据库:MySQL 8+、PostgreSQL、SQL Server等)
最灵活且易维护的方法是使用ROW_NUMBER()窗口函数,通过分组和排序来实现需求:
SELECT locationName, itemnumber, pickRouteOrder FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY locationName ORDER BY (CASE WHEN locationName = 'no-loc' THEN 0 ELSE 1 END), itemnumber ) AS rn FROM your_table_name ) t WHERE rn = 1 OR locationName = 'no-loc';
代码解释:
- 内层子查询中,
ROW_NUMBER()按locationName分组:- 对于
no-loc的分组,我们让排序优先级最高(CASE语句返回0),这样每条记录的rn都会被标记,但外层筛选时我们直接保留所有no-loc的记录 - 对于其他分组,按
itemnumber排序(你也可以换成其他字段,比如pickRouteOrder),每组第一条记录的rn为1
- 对于
- 外层筛选时,要么取
rn=1的非no-loc记录,要么直接保留所有no-loc的记录,完美匹配你的需求。
兼容低版本MySQL(不支持窗口函数)的替代方案
如果你的MySQL版本低于8.0,没法用窗口函数,可以用子查询结合GROUP BY来实现:
-- 先获取非no-loc分组的任意一条记录 SELECT locationName, itemnumber, pickRouteOrder FROM your_table_name WHERE locationName != 'no-loc' GROUP BY locationName, pickRouteOrder UNION ALL -- 再获取所有no-loc的记录 SELECT locationName, itemnumber, pickRouteOrder FROM your_table_name WHERE locationName = 'no-loc';
说明:
这里利用GROUP BY locationName, pickRouteOrder来对重复的locationName分组(因为你的重复分组里pickRouteOrder是相同的),如果同一locationName下pickRouteOrder可能不同,你可以用MIN(itemnumber)或者MAX(itemnumber)来指定取哪一条,比如:
SELECT locationName, MIN(itemnumber) AS itemnumber, pickRouteOrder FROM your_table_name WHERE locationName != 'no-loc' GROUP BY locationName, pickRouteOrder UNION ALL SELECT locationName, itemnumber, pickRouteOrder FROM your_table_name WHERE locationName = 'no-loc';
内容的提问来源于stack exchange,提问作者Rizwan Ali
相关产品推荐
相关产品推荐

