2012-07-26 64 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