2011-10-28 9 views
1

私はいくつかの検査データを含むテーブルを持っています。毎月すべての商品を検査する必要があります。ここでの目標は、毎月最後に検査されたレコードを見つけることです。SQL Oracle ---毎月最後のレコードを取得

表検査:

INSPECTION_I -------- INSPECTION_TS

200 -------------------- ------- 10/20/2011

201 ---------------------------- 2011/10/24

202 -------------------------- 10/26/2011

表Product_Inspection:

INSPECTION_I ------------------ ASSET_I

200 -------------- ---------------------- 1000

201 ---------------------- -------------- 2000

表Box_Inspection

INSPECTION_I -------- ASSET_I

202 ------------------------ 3000

表製品

ASSET_I ------- ----- ASSOCIATED_BOX_ASSET_I

1000年--------------------------- 3000

表のBOX:

ASSET_I ------------ OTHER_STUFF

3000 -------------------- #####

この場合、私が欲しいのはで、ではありません。私はMAX(to_char(inspection_ts、 'mm/yyyy'))をしようとしましたが、それは役に立たないです。もう一つの問題があります。何らかの理由で、商品や箱が1ヶ月に2回以上検査された場合にデカルトを取得し続けます。私が望むのは毎月1回の検査で、毎月の最後の検査でなければなりません。私は本当にそれに近づいていますが、誰かが助けることができれば、本当に感謝しています。入れ子にされたカーソルを使ってそれを得ることができましたが、私はそれを望んでいません。

答えて

3

を使用し、私は、クエリのこの種を行うに分析関数を使用する傾向があります。何かのように:

with data as 
(
    select 1 product_id, 100 inspection_id, to_date('09/04/2011', 'MM/DD/YYYY') inspection_date from dual union all 
    select 1 product_id, 101 inspection_id, to_date('09/14/2011', 'MM/DD/YYYY') inspection_date from dual union all 
    select 1 product_id, 103 inspection_id, to_date('10/04/2011', 'MM/DD/YYYY') inspection_date from dual union all 
    select 1 product_id, 105 inspection_id, to_date('11/01/2011', 'MM/DD/YYYY') inspection_date from dual union all 
    select 2 product_id, 102 inspection_id, to_date('09/24/2011', 'MM/DD/YYYY') inspection_date from dual union all 
    select 2 product_id, 104 inspection_id, to_date('10/05/2011', 'MM/DD/YYYY') inspection_date from dual 
) 
select * 
from 
(
    select 
     product_id, 
     inspection_id, 
     inspection_date, 
     row_number() over (
      partition by 
       product_id, 
       trunc(inspection_date, 'MM') -- Month 
      order by 
       inspection_date desc 
     ) rn 
    from 
     data 
) 
where rn = 1 -- indicates last inspection date of the month for each product 
+0

ヘイクレイグ、私は分析関数で作業していませんが、それは間違いなく何か見えるようです。ちょうどあなたに知らせるために、私はSPで入力パラメータを取得していて、Java DAOレイヤで取得しているカーソルを戻しています。したがって、その動的SQL文字列です。私がこのルートに行くと、これは私の現在のSPに統合されますか? – Bytekoder

+0

これは少なくともあなたが9iであると仮定して、あなたのSPのために働くことができるはずです。どのように動作させるかについてご質問がありましたら、お知らせください。 – Craig

0

は、サブクエリ

Select [ColName List] 
From TableName a 
Where DateTimeColumname 
    = (Select Max(DateTimeColumnName) 
     From TableName 
     Where DateTimeColumnName < 1+Last_Day(a.DateTimeColumnName)) 
関連する問題