构建 SQL 查询语句的疑问

2020-12-29 23:01:47 +08:00
 liquorppp
表 t:
字段 A 字段 B 字段 C ;
根据 C 字段进行分组,筛选出 B 字段最小的那一行,实现查询结果为不同 C 中最小的 B 的行的 A 字段集合。
有大佬有解决方案吗
2030 次点击
所在节点    MySQL
14 条回复
l00t
2020-12-29 23:18:37 +08:00
看不懂……
wanv1171
2020-12-29 23:38:35 +08:00
先进行分组,然后用 over 选出每组最小的 B 。然后重新根据这个结果筛选 C IN (SELECT C) AND B IN (SELECT B),然后 GROUP BY C, GROUP_CONCAT(A)
wanv1171
2020-12-29 23:44:36 +08:00
@wanv1171 应该是 group by C, B

第一步 over 之后应该也可以直接 group by
venhal
2020-12-29 23:44:55 +08:00
可以了解一下开窗函数,用 row_number()over()应该就可以满足
venhal
2020-12-29 23:52:46 +08:00
不过低版本的 mysql 好像不支持开窗函数,如果不支持的话
select
t1.a, t2.b, t2.c
from
t1
join
(select c, min(b) as b
from t
group by c) as t2 ON t1.c = t2.c AND t1.b = t2.b
lybcyd
2020-12-30 11:22:10 +08:00
子查询吧,先用 c 分组,用 min 函数查出最小的 b 值,作为一个表 x,然后再查询大表中 b 和 c 等于 x 中 b 和 c 的记录
zhuangjia
2020-12-30 11:30:39 +08:00
@l00t 换成实例:成绩表 t 中存储字段
A:学生 id,
B : 成绩,
C:科目
想要查询:每个科目成绩最低的同学的集合
liquorppp
2020-12-30 11:51:30 +08:00
@zhuangjia 实际场景是:
表 SKU
uuid
salePrice 售价
spuId SPUuuid
spuId 可能为空,查询出所有 SKU,如果 spuId 不为空,则取售价最低的那一条
l00t
2020-12-30 12:26:15 +08:00
两个售价一样低的你打算怎么整。
weiwenhao
2020-12-30 14:20:19 +08:00
select * from logs INNER JOIN (select MIN(id) as min_id FROM logs GROUP BY user_id) test on `test`.min_id = logs.id

类似这样?
ZanderNg
2020-12-30 14:34:34 +08:00
select t1.*
from (select t.a,
t.b,
t.c,
row_number() over(partition by t.a order by to_number(b)) as rank
from tgxt.test_a t
where t.c is not null) t1
where rank = 1
liquorppp
2020-12-30 14:52:00 +08:00
@weiwenhao 比较烦的是 min 内的是个价格,而不是类似 id 一样的字段
liquorppp
2020-12-30 14:52:28 +08:00
@l00t 一样的可以随便取一条
xdwmxx
2020-12-30 20:35:20 +08:00
select *
from (select t.A,
t.B,
t.C,
row_number() over(partition by t.C order by t.B) rn
from TEST_ROW_NUMBER_OVER t)
where t.B is not null
and rn = 1;
这样吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/740151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX