SQL - 选择所有行并使用带标识符的最大列值替换列值

时间:2014-03-11 05:42:08

标签: sql sql-server sql-server-2008 max

我已经在stackoverflow上查看了各种答案,用于选择最大值或替换列值,但我似乎无法弄清楚如何做到这两个并返回所有行。基本上我想返回所有行但是如果另一行在同一列中具有更高的数字且具有相同的标识符,则替换给定行中的列的值。

我不是SQL专家,这让我摸不着头脑,把头发拉出来...我希望这可以通过查询来完成,而无需更新数据。也许我需要重新编写数据,但这将是一项巨大的手动任务。也许我可以在视图中这样做?我很感激并愿意接受有关如何做到这一点的任何建议。

以下是正在查询的视图示例。 “代码”是公共字段。

+-------+-------+-----------------------------------+   
| type1 | type2 | code | amt |                      |   
+-------+-------+-----------------------------------+  
| 1     | A     | 100  | 59                         |  
| 1     | B     | 200  | 75                         |  
| 2     | C     | 100  | 65   <-- Max for code 100  |  
| 2     | D     | 200  | 80   <-- Max for code 200  |  
| 3     | E     | 100  | 55                         |  
| 3     | F     | 200  | 70                         |  
+-------+-------+-----------------------------------+ 

我需要返回所有行,但如果“code”相同而且另一行中的数字更高,则将“amt”替换为max值。这是我正在寻找的输出的一个例子:

+-------+-------+------------------------------------------------+   
| type1 | type2 | code | amt |                                   |   
+-------+-------+------------------------------------------------+  
| 1     | A     | 100  | 65 <-- replaced w/max for code 100      |  
| 1     | B     | 200  | 80 <-- replaced w/max for code 200      | 
| 2     | C     | 100  | 65                                      |  
| 2     | D     | 200  | 80                                      |  
| 3     | E     | 100  | 65 <-- replaced w/max for code 100      |
| 3     | F     | 200  | 80 <-- replaced w/max for code 200      |
+-------+-------+------------------------------------------------+ 

在查询中尝试此操作的原因是保留原始数据。这是可能的查询,还是我需要尝试更新数据?非常感谢!

3 个答案:

答案 0 :(得分:2)

你可以这样试试。

Select type1,type2,code,Max(Amt) Over(PARTITION BY Code) AS MaxAmt
from Table1

Sql Fiddle

答案 1 :(得分:0)

试试这个

Select Type1,type2,code,Max(Amt) Over(PARTITION BY CODE) AS Val
from Table1
Order by Type1

<强> Fiddle

答案 2 :(得分:0)

试试这个:

select type1,type2,code,Max(Amt) Over(PARTITION BY Code) AS amt
from Table1;

select t2.type1,t2.type2,t2.code,t1.max_amt amt from
table1 t2 inner join
(select max(amt) max_amt,code from table1 group by code)t1
on t1.code = t2.code;

SQL Fiddle