2012-07-26 65 views
0

我有一个名为TableA的表。Sql query - distinct groups

输入:

ColumnA  ColumnB ColumnC 
jim   1788   5F 
jim   2000   9F 
jim   500   9F 
ben   190   4H 
geri   40  manny 
geri   40  kelly 
geri   20  joker 
geri   20  jam 

输出:

ColumnA  ColumnB  ColumnC 
jim   2000   9F 
jim   2000   NULL 
ben    190   4H 
geri   40   manny 
geri   40   kelly 
geri   40   NULL 

有人可以帮助我的SQL查询?

的逻辑如下:

欲组的行由ColumnA,例如“gerri”组将有4排。对于每个组,计算来自ColumnB的最大元素,对于gerri组,它是40. 对ColumnB中的每个元素进行分析:如果element.ColumnB = maximum,则将该行放入输出中(如果不已经存在)。否则,如果element.ColumnB与最大值不同,那么当前行将被放入输出中,在ColumnC上为NULL,在ColumnB上为MAXIMUM(同样,如果输出中不存在)。

从我给出的例子中可以看得更清楚。

感谢您提前提出任何建议!

回答

3
; with maxes as (
    select ColumnA, 
     ColumnB, 
     ColumnC, 
     max(ColumnB) over (partition by ColumnA) mx 
    from tablea 
) 
select distinct 
     ColumnA, 
     mx ColumnB, 
     case when mx = ColumnB 
      then ColumnC 
      else null 
     end ColumnC 
from maxes 

Example on Sql Fiddle

+0

优秀,这创造了奇迹。非常感谢! – Sam 2012-07-26 12:57:44

+0

@TimA欢迎您:-) – 2012-07-26 12:58:42

0
WITH CTE AS 
(
    select ColumnA,MAX(ColumnB) as max 
    FROM TABLE 
)select ColumnA,b.max,CASE WHEN a.ColumnB=b.max THEN ColumnC ELSE NULL END 
FROM TABLE a 
INNER JOIN CTE b on a.ColumnA=b.ColumnA 
0

像这样的东西可能工作

with cte (columna,columnb) 
as 
( 
select columna,max(columnb) as columnb from table 
group by columna 
) 

select t1.columna,t1.columnb,t1.columnc from table as t1 inner join cte as ct 
on t1.columna=t2.columna and t1.columnb=t2.columnb 
union all 
select columa,columnb,NULL from cte