-2

テーブル「t1」を考えてみましょう:

+------------------------------+
| timestamp  | name | group_fk |
+------------+------+----------+
| 1362297600 | abc  | 41       |
| 1362384000 | bcd  | 41       |
| 1362470400 | cde  | 41       |
| 1362556800 | def  | 42       |
| 1362643200 | efg  | 42       |
+------------------------------+

各「group_fk」で最小の「タイムスタンプ」を持つ「名前」を選択する必要があります。したがって、結果は「abc」と「def」になります。

私はそれを行う醜い(そして常に正しいとは限らない)方法を知っています:

select name
from t1
where t1.timestamp IN (
  select min(t1_inner.timestamp)
  from t1 t1_inner
  group by t1_inner.group_fk
)

より良い解決策はありますか?

--DM

4

1 に答える 1

3

これは、サブクエリの使用を含むさまざまな方法で実行できます。

select t1.name, t2.minval
from table1 t1
inner join
(
  select min(timestamp) MinVal,
    group_fk
  from table1
  group by group_fk
) t2
  on t1.timestamp = t2.minval
  and t1.group_fk = t2.group_fk

SQL FiddlewithDemoを参照してください。

または、データベースにウィンドウ関数がある場合は、次を使用できますrow_number()

select name, timestamp
from 
(
  select name, timestamp,
    row_number() over(partition by group_fk order by timestamp) rn
  from table1
) src
where rn = 1

SQL FiddlewithDemoを参照してください

于 2013-03-05T23:53:50.970 に答える