库存生产-实用sql知识:如何在保证去重分组的情况下获取组内最新数据(可按时间排序),distinct +group by +嵌套结果 的联合妙用

这是花了一个小时实践出来的!

网上有特别多的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

我圈出了实现的关键步骤:
库存生产-实用sql知识:如何在保证去重分组的情况下获取组内最新数据(可按时间排序),distinct +group by +嵌套结果 的联合妙用

实现步骤实际比较简单:现在内部使用distinct关键字对库存id等多列去重(实际上几乎去不掉数据,时间一般不同,但是他会排序(指的是加order by后的排序结果能影响到group by)),外加一个时间降序排序,解决了group by 无法排序的问题

此时再包一个select * 并group by 就能达到效果了

大家踊跃实践呀!加油

上一篇:《AngularJS高级程序设计》——5.10 使用JSON


下一篇:查看oralce的版本及安装了哪些选项