1

次のようなテーブルがあるとします。

ProjectSts:

ID   Proj  Status  LogDate    FundsRemain  LogBy
60   2     Quit    1/5/2013   Yes          QOVM
59   2     Quit    1/4/2013   Yes          YZYO
58   2     Quit    1/3/2013   No           XYZ
54   2     Start   1/1/2013   NA           QOVM
50   1     Quit    12/2/2012  Yes          UUOI
48   1     Quit    12/1/2012  Yes          OIJP

現在私がやっているのは、へのSQL文SELECT * FROM ProjSts WHERE Status = 'Quit' AND FundsRemain = 'Yes'です。次に、別のアプリケーション内で、結果として得られるすべてのプロジェクト ステータス エントリを手動で読み取り、各プロジェクトの時系列で最初の (最も早い) ステータスを選択して、新しいテーブルにエクスポートできるようにします。

私が疑問に思っているのは、可能であれば、これをすべて SQL ステートメント内で実現する方法です。私は SQL Group By に関する多くのチュートリアルを見てきましたが、それらはすべて、各プロジェクトのすべてのエントリの数値フィールドを合計したり、平均したりしたい場合に何をすべきかを示しています。そして、INリストを生成する方法を示すサブクエリに関するいくつかのチュートリアルを見てきましたが、別の一意の値ごとに特定の基準を満たす、並べ替え後の最初のレコードのリストだけを生成するものは見たことがありません分野。

理想的には、上記の例のデータから、結果は次のようになります。

ID   Proj  Status  LogDate    FundsRemain  LogBy
48   1     Quit    12/1/2012  Yes          OIJP
59   2     Quit    1/4/2013   Yes          YZYO

申し訳ありませんが、私は最も高度な SQL ユーザーではありませんが、外部アプリケーションに依存して戻って選択結果を再処理する代わりに、SQL 内で実行できれば素晴らしいと思います。私が実際に必要としているもの。

任意の助けをいただければ幸いです (PS: これは ctree データベースからのものであり、現在、最初のデータ抽出に Crystal Reports 2008 を使用しています)

4

2 に答える 2

0

RDBMS によっては、MIN集計を使用してテーブルをそれ自体に結合するオプションがあります。

select p.*
from ProjSts p
  inner join (
    select min(LogDate) minLogDate, Proj
    from ProjSts
    where status='Quit' and FundsRemain = 'Yes'
    group by Proj
    ) p2 on p.Proj = p2.Proj and p.LogDate = p2.minLogDate

についてはよくわかりませんが、CTreeデータベースが をサポートしている場合Row_Number、これはおそらくより簡単な解決策です。

select *
from (
  select *, 
    Row_Number() Over (Partition By Proj Order By LogDate) rn
  from ProjSts
  where status='Quit' and FundsRemain = 'Yes'
    ) p
where rn = 1
于 2013-10-07T22:02:47.070 に答える