SQL分组后取第一条记录

整理上周的销售数据后,我发现了一个问题。
一位客户进行了多次购买,但想知道他们单次购买中最昂贵的订单是什么。
我想知道什么是最简单的方法来做到这一点。

我们先说个傻话吧。
我按单价降序对订单进行排序,然后对于每个客户,我直接获取他们列表中第一个订单的价格。
例如,张三购买了5 次,单价分别为1 00、2 00、3 00、2 5 0、1 5 0。
整理完后,我直接看张三的第一笔交易,3 00。
不错,简单明了。
但每次都要先把所有东西排序然后再查找,显得有点慢。
尤其是顾客很多的时候,如果等很久才提出要求,老板就会不耐烦。

后来我尝试了加入技巧。
我运行了一个查询,询问数据库每个客户购买了多少商品以及最昂贵的订单成本是多少。
然后用这个结果作为板子,连接到主控板。
连接时以客户ID为条件,以及最贵订单的价格,保证只连接最贵的订单。
之后结果直接出来,无需事先排序。
然而,这种方法对于数据库来说就像绕口令一样。
写完之后我也看不懂。
而且看起来它只能用于大小可能相当的字段,例如数字和日期。
如果客户的备注上写着“紧急”或“礼物”,那就没有用了。

另一种方法是首先使用窗口函数。
按单价降序对订单进行排序,然后在每个客户组内使用 ROW_NUMBER() 对其进行编号。
最昂贵的 ROW_NUMBER()=1 只需删除结果即可。
这个方法看起来很先进。
当我与数据库交谈时,它实际上使用了“窗口函数”这个词,这让我头晕。
写起来有点复杂,但是优点是灵活。
如果您愿意,您可以选择最高、最低或中间。
数据库必须支持这一点,并非所有老式系统都能做到这一点。

这三种方法各有各的缺陷。
有时候我觉得数据库其实是一个玄学。
一件简单的事情怎么会变得如此复杂?等等,我刚刚写的Join方法应该加ON吗?这似乎是必要的。
突然我想,如果客户买了很多东西,比如几千个订单,使用ROW_NUMBER()会不会特别慢?你必须尝试一下才能找到答案。

如何用SQL SERVER取分组数据第一条

这是一个洞。
不要这样做。
使用 ROW_NUMBER()。

sql 选择 来自( 选择, ROW_NUMBER() OVER (PARTITION BY table1 _id ORDER BY id) AS rn 从表1 INNER JOIN table2 IN table1 .id = table2 .table1 _ID ) 作为查询 其中 rn = 1 ;
实用提醒:ROW_NUMBER() 是可靠的。

如何用SQL SERVER取分组数据第一条

查找表1 中各组的最早记录: sql 选择自 ( SELECT a.、b.用户 从表 1 a INNER JOIN table2 b ON a.id = b.table1 _id ) AS new_tbl 哪里 b.用户输入( SELECT MIN(用户) FROM table2 GROUP BY table1 _id )
SQLServer 使用 ball,MySQL 使用 limit,Oracle 使用 rownum: sql -
SQLServer 从...中选择前 1 个 -MySQL 从... 限制 1 中选择; -
甲骨文 SELECT FROM ... WHERE ROWNUM <= 1 ;
您决定。