2011-10-04 137 views
1
Id  User Val1 Val2 
11910115 Fred 123 -0.000137 
11910116 Fred 456 0 
11910117 Fred 789 0.0002 
11910118 Sue 101 8.7E-05 
11910119 Sue 102 0.000125 
11910120 Sue 103 0 

的意圖:GROUP BY和聚合值

Select Id,User,Val1,Max(abs(val2)) val2 
From MyTable 
Group By User 

什麼我後:

11910117 Fred 789 0.0002 
11910119 Sue 102 0.000125 

我會滿足於爲:

11910117 0.0002 
11910119 0.000125 

但是,我無法避開'在選擇列表中無效,因爲它不包含在eith中呃聚合...'

+0

,哪一個是無效在選擇列表中? – GolezTrol

回答

1

每個非聚合的字段應該出現在組中。因此,假如你想要聚合VAL1太:

Select Id, User, max(Val1) val1, max(abs(val2)) val2 
From MyTable 
Group By Id, User 
+0

這不是OP想要的 - 他不想要val1的最大值,而是val1的值,它屬於val2的最大值。 –

+0

根據問題中給出的預期結果,max(val1)不是期望的結果。 –

+0

我在那裏做了一個假設。 val1根本沒有被彙總,儘管它被分成了預期的結果。這是'Fred'的最大值,所以我認爲它可能是Sue的拼寫錯誤。可以將其更改爲'decode(User,'Fred',max(val1),avg(val1))',但這也沒有多大意義。 ;) – GolezTrol

1
SELECT y.Id, y.User, y.Val1, t.MaxVal 
    FROM YourTable y 
     INNER JOIN (SELECT User, MAX(ABS(val2)) AS MaxVal 
         FROM YourTable 
         GROUP BY User) t 
      ON y.User = t.User 
       AND ABS(y.Val2) = t.MaxVal 
    WHERE y.User = 'Fred' 
+0

對不起,我忽略添加'where'子句。但是,如果我輸入「Where y.user = Fred」,我會得到相同的3行: 11910115 Fred 123 -0.000137 11910116 Fred 456 0 11910117 Fred 789 0.0002 – JonV

+0

@JonV:我的錯誤。你想用''而不是'Id'工作。我會更新答案。 –

+0

是的,就是這樣 - 謝謝! – JonV

0
select Id, User, Val1, Val2 
from MyTable t1 
where not exists 
(
    select * 
    from MyTable t2 
    where t2.Id != t1.Id 
    and t2.User = t1.User 
    and abs(t2.Val2) > abs(t1.Val2) 
) 
0

試試這個

SELECT t.id, t.user, t.val1, t.val2 
FROM mytable t 
    INNER JOIN 
     (SELECT user, MAX(ABS(val2)) AS max 
     FROM mytable 
     GROUP BY user) q ON t.user = q.user AND ABS(t.val2)=q.max 

不知道如何有效的,這將是你的桌子上,雖然。