我有一张这样的桌子:
CustomerID - ProductID - Score
Customer1 - Product1 -- 9
Customer1 - Product2 -- 10
Customer2 - Product3 -- 11
Customer2 - Product4 -- 7
Customer3 - Product1 -- 6
我想按客户ID对其进行分组。并只为得分最高的客户选择该行 所以,我的桌子应该变成:
Customer1 - Product2 -- 10
Customer2 - Product3 -- 11
Customer3 - Product1 -- 6
如何在SQL中执行此操作?
答案 0 :(得分:4)
尝试使用SQL rank
函数对子组中的行进行排序并选择排名第一的行,如下所示。
Select * from
(
Select CustomerId,
productId,
Score,
Rank() Over (PARTITION BY CustomerId ORDER BY Score DESC) AS Rnk
) query Where rnk = 1
答案 1 :(得分:0)
尝试一下: 从表组中按CUST_ID,PROD_ID选择CUST_ID,PROD_ID,MAX(SCORE)作为得分;
答案 2 :(得分:0)
您需要对包含最大值的临时表进行“分组”,然后内部连接到临时表。
https://www.w3schools.com/sql/sql_groupby.asp
http://codingsight.com/introduction-to-temporary-tables-in-sql-server/
您无法在单个select语句中执行您要执行的操作,因为在第一个select语句运行完毕之前,SQL Server实际上无法告诉最大值。这就是为什么您需要编写第二个查询并根据与临时表具有相同值的行进行联接的原因