2011-09-26 70 views
1

我有一个“收入”表,用于存储公司州组合的收入。需要GROUP BY SQL的帮助

Company int 
State char(2) 
IsBiggestState bit 
TotalRevenue numeric (10,2) 

如果TotalRevenue数量是公司内所有州的最大数量,我需要将IsBiggestState位设置为1。

你能帮我写SQL吗?由于我正在处理数百万条记录,因此效率值得关注。

我们在SQL2008 R2上。

+0

您使用的是什么RDBMS和版本? – Lamak

+1

如果两个州的某个公司的收入相同,该怎么办? – RedFilter

回答

2
UPDATE A 
SET A.IsBiggestState = 1 
FROM YourTable A 
INNER JOIN (SELECT Company, MAX(TotalRevenue) MaxRevenue FROM YourTable 
      GROUP BY Company) B 
ON A.Company = B.Company AND A.TotalRevenue = B.MaxRevenue 
+0

您需要在您的子查询中使用“GROUP BY”。如果有两个州的收入相同(最高),这也可能有问题,但我希望他会希望他们都标记您的查询会执行哪些操作。 – JNK

+0

@JNK哦,是的,我喜欢。更新我的答案,谢谢。是的,我认为同一个收入最高的不止一个州也是如此。 – Lamak

1

这将解决2个州具有相同TotalRevenue(如果这确实是一个问题)的问题。它只会将其中的一个标记为IsBiggestState。我不完全确定性能与其他解决方案相比如何。

UPDATE A 
SET A.IsBiggestState = 1 
FROM Revenue A 
INNER JOIN 
(
    SELECT 
     Company 
     ,[State] 
     ,ROW_NUMBER() OVER (PARTITION BY Company ORDER BY TotalRevenue desc) as rownum 
    FROM Revenue 
) B 
ON A.Company = B.Company AND A.[State] = B.[State] AND B.rownum = 1 
+0

您确定可以使用别名“A”来指定目标表吗?我不认为别名在这种情况下工作。 – ChadD

+0

它应该很好。 – kevev22