MySQL如何实现Excel分组排序功能电脑分组如何自由排序

结论:MySQL利用用户变量实现分组排序,得到TOP数据。

步骤: 1 . 将数据按省份和销量降序排序。
2 . 使用用户变量为每个组分配序列号。
3 . 使用HAVING 过滤每组中的第一个数据项。

代码: sql 选择一个, IF(@v_provice = 省份, @v_rank := @v_rank + 1 , @v_rank := 1 ) AS 排名, @v_provice := 省份 AS 规定2 FROM (SELECT FROM tmp_provice_sales ORDER BY 省份, sales DESC) a, (选择@v_provice:= NULL,@v_rank:= 0)bh WHERE a.省 = bh.省 GROUP BY 省、市、营业额 排名 = 1 ;
注意:
必须保证排序字段和分组字段正确。

用户变量必须在 JOIN 中初始化。

最后一句话:这个工作实在是太离谱了。

mysql分组排序,取每组第一条数据

说白了,MySQL 5 .7 中SQL语句的编写方式,尤其是涉及排序、分组、派生表的SQL语句,其实是相当复杂的。
首先我来说说最重要的一点。
当你看到一条SQL语句需要排序然后分组才能得到每组的第一条数据时,一定要谨慎使用派生表。

我们去年跑的项目在数据排序方面出现了问题,就是因为我们没有关注这个细节。
例如,我们使用子查询或临时表对数据进行排序,然后对结果进行分组,发现并没有达到预期的效果。
为什么?因为一旦外部表使用GROUP BY,临时表就不会执行filesort操作,这意味着ORDER BY将被忽略。

后来我意识到有些不对劲。
原来,ORDER BY要在派生表中生效,必须满足三个条件:外表使用GROUP BY,派生表有ORDER BY,派生表有GROUP BY、LIMIT、HAVING、DIFFERENT等其中之一。
比如我们可以在派生表中添加distinct(A.ID)的TID,这样ORDER BY才能生效。

等等,还有一件事。
如果删除派生表中特定的(A.ID)TID,你会发现子查询中的ORDER BY A.ID DSC无效。
很多人不重视这一点。
事实上,派生表中的顺序不能有效,因为已单独删除。

我认为值得尝试的是,在使用派生表和订单时,应该仔细检查这三个条件是否满足。
另外,如果您对MySQL的派生表优化感兴趣,可以查看文档(https://dev.mysql.com/doc/refman/5 .7 /en/driven-table-optimization.)。
这个时候很多人都有被困的危险,一定要小心。