这是花了一个小时实践出来的!
网上有特别多的distinct +group by 的比较区别的,几乎没有几篇文章说他们的联合妙用。
步入正题,先说我发现妙用的基于实际问题:
库存与入库单的一个关系业务:在统计库存时,需要带出与库存相关的且是最近的入库单的一个入库人作为库存数据的一个属性
那么问题来了,业务中一个库存记录可能会存在多张入库单与之关联,要去取最新的入库单的信息与库存信息关联,假设关联入库单信息为lastInUserName(最后入库人),不可避免的查出一个重复的库存记录,但实际上数据库只有一条这样的记录,
那咋整: 是的 group by 登场了,我直接group by 库存记录id ,就只会存在一条记录了,group by必须存在。
未满足的要求:我们还需要取最新的库存入库单的信息condition_in,怎么取呢?我们既不能简单升序或降序来排序入库单号、id,实际入库时间来获取到我们想要的结果。
为什么? 因为我们不止一条库存记录,而且 group by 本身是不会排序的,他只会保留最早物理插入数据库的那个符合去重的条件(某些业务可能刚刚需要这样的),和本次要求是不符合的,而且order by 也不能用,因为他执行顺序在group by 后,因此没了意义。
怎么办? 请出正确方法:distinct +group by +嵌套结果,一套组合语法打到数据上,完美
来看业务sql(已删除大部分无关表信息):
tsn.id 库存id
lastInUserName 最新库存入库单信息
storage_time 实际入库时间,希望取得分组内最新入库时间,遗憾的是单靠group by无法实现
SELECT* from (
SELECT distinct tsn.id stockId,
tsi.storage_user_name lastInUserName,
cast( tsn.id AS CHAR ) id
FROM
INNER JOIN tdm_stock_in_head tsi ON tsi.stock_in_code in(
SELECT
in_out_id
FROM
tdm_stock tb
WHERE
AND tb.is_delete = 0
AND tsi.is_delete = 0
AND tsi.audit_status = 1
AND in_out_id LIKE 'R%'
group by in_out_id
)
ORDER BY tsi.storage_time DESC) tmp
group by tmp.stockId
我圈出了实现的关键步骤: