4

次の例示的な表を想像してみてください。

time      name     value1 value2
12:00     Hans     2      4
12:30     Hans     2      4
13:00     Hans     3      5
14:00     Peter    4      4
15:00     Peter    4      4

最大のタイムスタンプと名前でフィルタリングしたい。

取得したい意味

13:00     Hans     3      5
15:00     Peter    4      4

使用select max(time),name,value1,value2 from table group by name は機能しません。value1とvalue2でも集計関数またはgroupbyを使用するように指示されます。

名前、value1、value2でグループ化すると、次の結果が得られます。ただし、value1とvalue2は2行のハンスで異なるためです。

12:30     Hans     2      4
13:00     Hans     3      5
15:00     Peter    4      4

解決策は何ですか?

4

2 に答える 2

6

サブクエリを使用しmax(time)てそれぞれのを取得しname、それをテーブルに結合して最終結果を取得できます。

select t1.time,
  t1.name,
  t1.value1,
  t1.value2
from yourtable t1
inner join
(
  select max(time) MaxTime, name
  from yourtable
  group by name
) t2
  on t1.time = t2.maxtime
  and t1.name = t2.name

使用しているデータベースに応じて、row_number()またはrank()のようなウィンドウ関数を適用できる場合、クエリは次のようになります。

select time, name, value1, value2
from
(
  select time, name, value1, value2,
    rank() over(partition by name order by time desc) rn
  from yourtable
) src
where rn = 1

両方のクエリのデモを含むSQLフィドルを参照してください

于 2013-03-11T11:48:12.533 に答える
1

それは非常にdistinct on簡単です。SQL フィドル

select distinct on (name)
    "time", name, value1, value2
from t
order by t.name, t."time" desc
于 2013-03-11T13:30:01.563 に答える