0

次の列を持つテーブル「uservalue」があるとします。

integer user_id
integer group_id
integer value

各グループの最大値を簡単に取得できます。

select max(value) from uservalue group by group_id;

私が欲しいのは、最も高い値を持つ各グループのuser_idを返すことです。matlabのmax関数も最大値のインデックスを返しますが、postgresqlに同じことをさせる方法はありますか?

4

3 に答える 3

1

これを行う適切な方法は、サブクエリを使用することです。

select 
    u.user_id,
    u.value 
from 
     uservalue u
join
    (select groupid, max(value) as max_value from uservalue group by group_id) mv
    on u.value = mv.max_value and mv.group_id = u.group_id

ただし、より単純なハックを好むこともあります。

select max(value*100000 + user_id) - 100000, max(value) from user_value group by group_id

番号 (100000) が、想定しているユーザー ID よりも大きいことを確認してください。これにより、同じ値で 1 つの user_id のみが選択され、もう 1 つは両方が選択されるようになります。

于 2009-07-16T21:25:33.653 に答える
1

次のようなウィンドウクエリでこれを行うことができるはずです。

SELECT DISTINCT 
  group_id,
  first_value(user_id) OVER w AS user,
  first_value(value) OVER w AS val
FROM
  uservalue
 WINDOW w AS (PARTITION BY group_id ORDER BY value DESC)

このクエリは、同じ値を持つ複数のユーザーがいる場合にも機能します (ORDER BY に 2 番目の列を追加しない限り、どの列が返されるかはわかりませんが、グループごとに 1 行しか返されません)。

于 2009-07-21T07:40:44.813 に答える
0

これを行ういくつかの方法があります。

それはほとんどFAQです。

于 2010-01-27T13:06:38.670 に答える