2016-06-28 4 views
2

私はSQLを非常に新しくしており、これは私を酷使しています。このクエリで私を助けてくれますか?グループごとに最大値を持つ各行を選択するためのクエリ

Iは、以下の2つのテーブルを有する:

表1:IssueTable

Id | RunId | Value 
--- 
1 | 1  | 10 
2 | 1  | 20 
3 | 1  | 30 
4 | 2  | 40 
5 | 2  | 50 
6 | 3  | 60 
7 | 4  | 70 
8 | 5  | 80 
9 | 6  | 90 

表2:RunTable

RunId  | EnvironmentId 
--- 
1   | 1 
2   | 3 
3   | 1 
4   | 2 
5   | 4 
6   | 2 

Iによりグループ化された最大RUNIDを表すIssueTable行を必要としますRunTableのEnvironmentId。私はテーブルから必要となる結果は次のとおりです。

期待される結果:

Id | RunId | Value | EnvironmentId 
--- 
4 | 2  | 40 | 3 
5 | 2  | 50 | 3 
6 | 3  | 60 | 1 
8 | 5  | 80 | 4 
9 | 6  | 90 | 2 

のでEnvironmentIdあたりRunTableから最新/最高RUNID持つ行のみ。たとえば、EnvironmentIdが "1"の場合、RunTableのEnvironmentId "1"の最新のRunIdが "3"であるため、RunIdが "3"の行だけが必要です。同様に、EnvironementId "2"の最新の実行はRunId "6"でした。

+1

あなたのRDBMSは何を? SQL Server、postgres、oracle? –

答えて

2

サブテーブルを使用して、各環境IDの最大runidをランテーブルから取得します。取得した結果を発行者に結合し、必要な列を選択します。

select i.id, i.runid, i.value, r.environmentid 
from (select environmentid, max(runid) maxrunid 
     from runtable 
     group by environmentid) r 
join issuetable i on i.runid = r.maxrunid 
order by i.runid, i.id 
1

1があなたの記録のいくつか順位を生成するために、RANK、DENSE_RANK、ROW_NUMBERなどの分析機能を使用することができ、これらの日。

ウィンドウ関数は、ANSI SQL:2003標準の一部です。
そして私はTeraData、OracleとSQL-Serverで少なくともそれらを遭遇しました。

select Id, RunId, Value, EnvironmentId 
from (
    select i.*, r.EnvironmentId, 
    dense_rank() over (partition by r.EnvironmentId order by r.RunId desc) as RN 
    from issuetable i 
    inner join runtable r on (i.RunId = r.RunId) 
) Q 
where RN = 1 
order by Id; 

内側のクエリは次の結果生じるであろう:

Id RunId Value EnvironmentId RN 
1 1  10  1    2 
2 1  20  1    2 
3 1  30  1    2 
4 2  40  3    1 
5 2  50  3    1 
6 3  60  1    1 
7 4  70  2    2 
8 5  80  4    1 
9 6  90  2    1 
+1

窓関数は1999年ではなくSQL:2003で導入されました。DB2、Postgres、Firebirdなどもサポートしています。 –

+0

実際、私が見つけた記事は、誤ってそれらの関数の誤った標準を仮定しました。それを指摘してくれてありがとう。答えで修正されました。 – LukStorms

関連する問題