2016-09-24 4 views
0

私は1年のフィールドを持つ非常に特殊な問題があります。私はそれらを引き出し、各行を見て選択リストから選択した年よりも大きい年を選択するための条件を作成するクエリを持つ必要があります。私が使用する結合にはフィルタリングする必要がある行例私は列1,2,3,4としてIDを持っています。しかし、私はいくつかの余分な1の5つの行を1つのと言うだろう。私は、別の列で最大の年を持たない余分な1をすべて除外したいと思います。そのため、ID列を使用して比較できる行を確認し、年の列で最も大きな年の行のみを保持する必要があります。比較する必要のあるグルーピングがあります。 2と3のすべてを言ってください。それでも最も大きな年のものを保ち、それ以下のものを除外します。Meridium SQLクエリ設計

以下は、サービスではなくなっている私たちの行もフィルタリングする種類のベースラインクエリです。

SELECT CDFT_Test_Results_Primary_M."Equipment ID" "Equipment ID", 
CDFT_Test_Results_Primary_M."Pass/Fail" "Pass/Fail", 
CDFT_Test_Results_Primary_M."Failure Type" "Failure Type", 
CDFT_Test_Results_Primary_M."Desired Interval (MO)" "Desired Interval (MO)", 
CDFT_Test_Results_Primary_M."Task Description" "Task Description", 
CDFT_Test_Results_Primary_M."Year" "Year", 
CDFT_Test_Results_Primary_M."Site" "Site", 
CDFT_Test_Results_Primary_M."Device Type" "Device Type", 
CDFT_Test_Results_Primary_M."Execution Date" "Execution Date", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer" "Eqpt Manufacturer", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer Model Num" "Eqpt Manufacturer Model Num", 
CDFT_Test_Results_Primary_M."Eqpt Manufacturer Serial Nu" "Eqpt Manufacturer Serial Nu", 
CDFT_Test_Results_Primary_M."Decommission Year" "Decommission Year", 
CDFT_Test_Results_Primary_M."Commission Year" "Commission Year", 
CDFT_Test_Results_Primary_M."Equipment Key" "Equipment Key", 
CDFT_Test_Results_Primary_M."Test Key" "Test Key" 

FROM (! 'Personal[cmgray1]\Queries\CDFT Updated\CDFT Test Results Primary Multi Year Pre Non-Test') CDFT_Test_Results_Primary_M 

WHERE (((CDFT_Test_Results_Primary_M."Year" <= CDFT_Test_Results_Primary_M."Decommission Year" 
AND CDFT_Test_Results_Primary_M."Year" >= CDFT_Test_Results_Primary_M."Commission Year") 
AND CDFT_Test_Results_Primary_M."Decommission Year" >= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl) 
AND CDFT_Test_Results_Primary_M."Commission Year" <= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl)) 
OR (CDFT_Test_Results_Primary_M."Decommission Year" IS NULL AND CDFT_Test_Results_Primary_M."Commission Year" IS NULL) 
OR (CDFT_Test_Results_Primary_M."Year" >= CDFT_Test_Results_Primary_M."Commission Year" 
AND CDFT_Test_Results_Primary_M."Decommission Year" IS NULL 
AND CDFT_Test_Results_Primary_M."Commission Year" <= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl)) 
OR (CDFT_Test_Results_Primary_M."Year" <= CDFT_Test_Results_Primary_M."Decommission Year" 
AND CDFT_Test_Results_Primary_M."Decommission Year" >= (? :s :caption='Year Selection' :id=DecomYear :l='2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020' :excl) 
AND CDFT_Test_Results_Primary_M."Commission Year" IS NULL)) 

あなたはタスクの説明の下に複数の年を取得する機器IDによって、あなたがグループ場合は、以下を参照してくださいすることができたよう。私はグループセットの中で最大のものを選んで残りを除外したいと思っています。例えば、2009年は除外されるべきであり、2013年のポイントは同様の機器IDの機器のために残る。

enter image description here

+0

私が見なければならない方向のアイデアはうまくいくでしょう。私はしばらくの間これを困惑しています。 – ColdTeck

+3

あなたはその形式で独自のクエリを読むことができますか?私はできませんでした。読みやすい形でフォーマットし、コアの問題に縮小してください。 –

+0

どのrdbmsすべて3? 3つすべての場合、通常はOracleとSQL Serverを取り出すことができます。なぜなら、mysqlは関数固有のメソッドからの制限の1つになるからです。次に、私はjuergenのフォーマットを読みやすくするためにそれに同意します。私はあなたにすることを始めましたが、あなたには言いません。次に、システムの機能をよく知っている人より多くのアドバイスを求めているので、イメージが本当に何であるか教えてくれる必要はありません。最後に、サンプルデータと望ましい結果を含める必要があります。しかし、説明をMax Yearに再考する必要があるように思えます。row_numberの変数cteを入力してください。 – Matt

答えて

0

私はその列にMAX関数を使用し、その後IDによってグループにサブクエリを作ることになりました。次に、私は必要なものを正確に得るために元のクエリに戻る結合関数を使用しました。