分组计算 排序去重

上周我的朋友在使用Java8 StreamAPI处理数据,分组,我发现排序和提取特别方便。
例如,他计算按部门分组的员工数量,并使用一行代码来完成此操作:staff.stream().collect(Collectors.groupingBy(Employee::getDepartment, Collectors.counting())))。
排序也很简单。
可以使用比较器来实现多字段排序。

2 02 3 年,听说MySQL也可以,但是你得写SQL语句。
例如,计算各部门的平均工资;它看起来像这样:选择部门;按部门分组的员工的平均工资(平均工资)。
ORDER BY 也用于排序,窗口函数也可用于组内排序。

我朋友的公司也大量使用Excel,尤其是数据量不大的时候。
数据透视表用于分组和计算;他说,还有用于排序和复制的特殊工具。

但是,这些方法都有其自身的优点,必须根据数据大小和处理要求进行选择。
JavaStream适合内存中处理; MySQL适合大型数据集,Excel适合快速交互式分析。
这取决于你。

sql中group by和oder by怎么一起使用

哎,SQL GROUP BY 和 ORDER BY 一起使用真是头疼啊。
听我给你解释一下,不要困惑,不明白。

我们先来说说GROUP BY。
说白了,这就是把你表中的数据按照某个字段分组成一堆。
例如,如果按照学号划分,则具有相同学号的所有数据将被分组到一起。
我之前在一个项目中使用过它,它是按订单月份分组的。
结果那个月的订单仍然混乱,所以不得不使用 ORDER BY。

我们来谈谈 ORDER BY。
这是排序顺序。
你把它们分成一堆,但必须有一个优先顺序,对吗?例如,如果我想按分数从高到低排序,我必须使用 ORDER BY Score DESC。
说实话,当时我很困惑。
按student_id分组后,我还想直接按课程名称排序。
结果出现错误,提示GROUP BY中没有出现课程名称。
这确实是一个障碍。

举个例子吧。
看看这个: sql 选择学生 ID、课程名称、成绩 来自学生 按学生 ID 分组 ORDER BY DESC Score;
说实话,这种写法是相当危险的。
因为GROUP BY Student_id之后,组内记录的顺序就乱了。
在某些数据库中运行时可能会出错。
我尝试了一次,在MySQL中勉强可以运行,但结果却不是我所期望的。

所以正确的写法是: sql SELECT Student_id, AVG(score) 作为平均值 来自学生 按学生 ID 分组 ORDER BY GPA DESC;
你看,我按学生 ID 对学生进行分组,计算每组的平均分数,然后按平均分数降序排序。
这样,结果就稳定了。

还有一个缺点,就是所有非聚合列都必须写在GROUP BY中。
例如,如果您想使用 Course_name,那么它必须出现在 GROUP BY 中: sql SELECT Student_id, MAX(课程名称) AS 课程模板,成绩 来自学生 按学生 ID、分数分组 ORDER BY 点 DESC;
你看,我已将点添加到 GROUP BY 中,所以没有问题。

最烦人的是你必须通过 ORDER BY 知道要订购什么。
它可以是组列或聚合结果,但必须出现在 GROUP BY 中。
如果你直接评价 Course_name 肯定不行。

另一个对多列进行分组和排序的示例: sql 选择部门,student_id,AVG(分数)AS avg_score 来自学生 GROUP BY 部门,student_id ORDER BY Department ASC, GPA DESC;
你看,首先按院系分组,然后按学生 ID 分组。
排序也是按教师升序排列,然后按 GPA 降序排列。
这个秩序不能被扰乱。

另一个误解是GROUP BY可以在组内排列顺序。
大错!组内顺序比较混乱,必须使用ORDER BY单独排序。
我以前也犯过这个错误,导致数据混乱。

我们来总结一下。
GROUP BY 堆叠、ORDER BY 排序丈夫。
堆排序后,请确保 ORDER BY 列出现在 GROUP BY 中。
不要盲目地安排事情。
如果你安排不正确,一切都会变得混乱。

对于更复杂的情况,例如先订购某样东西,最后订购某样东西,您必须使用 CASE WHEN。
但那是另一个故事了。
我们先来了解一下这些。