1

次の形式のテーブルがある場合:

ID NAME NUM TIMESTAMP BOOL
1  A    5   09:50     TRUE 
1  B    6   13:01     TRUE
1  A    1   10:18     FALSE   
2  A    3   12:20     FALSE
1  A    1   05:30     TRUE
1  A    12  06:00     TRUE

一意の ID、NAME の各ペアの ID、NAME、および NUM を最新のタイムスタンプと BOOL=TRUE で取得するにはどうすればよいですか。

したがって、上記の表の場合、出力は次のようになります。

ID NAME NUM
1  A    5
1  B    6   

Group By を使用してみましたが、アグリゲーター関数を num の周りに配置する必要があるか (この例に適用すると max、min は機能しません)、group by で指定する必要があること (ID で一致することになります) を回避できないようです、NAME、および NUM を組み合わせたもの)。私が考える限り、どちらもいつか壊れるでしょう。

PS: SQL Developer を使用しています (これは、Oracle によって開発された SQL だと思います。申し訳ありませんが、私は初心者です)。

4

3 に答える 3

2

少なくとも SQL-Server 2005 を使用している場合は、次のROW_NUMBER関数を使用できます。

WITH CTE AS
(
   SELECT ID, NAME, NUM,
      RN = ROW_NUMBER()OVER(PARTITION BY ID, NAME ORDER BY TIMESTAMP DESC)
   FROM Table
   WHERE BOOL='TRUE'
)
SELECT ID, NAME, NUM FROM CTE
WHERE RN = 1

結果:

ID     NAME   NUM    
1       A      5     
1       B      6     

これがフィドルです:http://sqlfiddle.com/#!3/a1dc9/10/0

于 2012-07-20T08:53:31.973 に答える
0
select t1.* 
from TABLE1 as t1 
left join
TABLE1 as t2 
on t1.name=t2.name and t1.TIMESTAMP>t2.TIMESTAMP
where t1.BOOL='TRUE' and t2.id is null

あなたのためにそれをすべきです。

于 2012-07-20T09:01:49.420 に答える
0
select t1.* from table as t1 inner join
(
select NAME, NUM, max(TIMESTAMP) as TIMESTAMP from table
where BOOL='TRUE'
) as t2
on t1.name=t2.name and t1.num=t2.num and t1.timestamp=t2.timestamp
where t1.BOOL='TRUE'
于 2012-07-20T08:54:05.670 に答える