在实际业务中,我们经常会遇到如何从同一个字段相同值中获取最新一条数据的问题。经自身积累以及百度之后,将常用的方法记录下来。
具体事例
由于使用的表的数据较多,所以只展示了部分数据
<>group by的方式
第一种
SELECT order_id, max( product_price ) AS product_price FROM oms_order_item
GROUP BY order_id
得到的结果
注意:
SELECT id, order_id, max( product_price ) AS product_price FROM oms_order_item
GROUP BY order_id
如上述SQL,若想获取其他字段的数据,而直接在SQL语句上增加该字段的话,查询到的结果是不一致的(product_price
最大的那条数据对应的id应该是25,而查询出来的id是21(默认显示分组后的第一条数据的值)),需注意。由于能力有限,具体原因并不知道。若有大佬知道,希望能给出答案。
第二种
SELECT a.id, a.order_id, a.product_price FROM ( SELECT * FROM oms_order_item
ORDER BY product_price DESC LIMIT 10000 ) a GROUP BY order_id
因为在mysql5.7的时候,子查询的排序已经变为无效了,可能是因为子查询大多数是作为一个结果给主查询使用,所以子查询不需要排序的原因。
所以,对子查询的排序进行limit限制,此时子查询就不光是排序,此时排序会生效,但是限制条数却只能尽可能的设置大些。
<>窗口函数的方式
序号函数:ROW_NUMBER()、RANK()、DENSE_RANK()
SELECT a.id, a.order_id, a.product_price FROM ( SELECT order_id, ROW_NUMBER ( )
OVER ( PARTITION BY order_id ORDER BY product_price DESC ) AS price_order,
product_priceFROM t_score ) a
头尾函数:FIRST_VALUE(expr)、LAST_VALUE(expr)
SELECT id, order_id, product_price, FIRST_VALUE ( product_price ) OVER w AS
first_price, LAST_VALUE ( product_price ) OVER w AS last_price FROM
oms_order_item WINDOW wAS ( PARTITION BY order_id ORDER BY product_price )
由于mysql版本过低(8.0及以上才可使用窗口函数),无法使用。只是将用法记录一下。