2017-01-17 7 views
1

私は多くのレコードを持つテーブルを持っています。私はここで基準(使用、無効)に基づいて大きなデータセットを照会

ID  ItemID  ItemDate  ItemCompany  ItemRecord 
11153 1123   1/17/2016  Apple   Use 
11555 1123   2/17/2016  Apple   Void 
12345 1125   3/22/2016  AON    Use 
15667 1333   6/22/2016  Adobe   Use 
19790 1333   9/23/2016  Adobe   Void 
20394 1333   10/1/2016  Adobe   Use 

テーブルの構造が、だからここに私の問題だだ....それを行う方法を考え出す

を、それを照会しようとしているが、非常に困難な時期を持っています。私はUSEのアイテムしか見つけようとしていません。 1が使用され、もう1つはVOIDです - - それは、それがシステムに戻しています無効だそう - したがって、それは持っているので、このケースでは、私の所望の最終結果は

ID  ItemID  ItemDate  ItemCompany  ItemRecord 
12345 1125   3/22/2016  AON    Use 
20394 1333   10/1/2016  Adobe   Use 

APPLEは、2つのレコードを持っている....このようになります。使用されていません。一方、ADOBEではUSEを使用してからVOIDを使用し、再度USEが使用されたことを意味します。

USEを持つレコードのみを照会する方法はありますか(ただし、VOIDがある場合は2番目のUSEが続くかどうか確認してください)。彼らがしない場合は、すべてのレコードを表示しないでください。

答えて

2

ええと、最近の日付にUseがあるかどうか知りたいと思うと思います。ここでは一つの方法である:

select t.* 
from t 
where t.itemdate = (select max(t2.itemdate) 
        from t t2 
        where t2.itemId = t.itemId and t2.ItemRecord = 'Use' 
        ); 

ます。また、ウィンドウ関数を使用してこれを行うことができます。

select t.* 
from (select t.*, 
      max(itemdate) over (partition by itemId) as max_itemdate 
     from t 
    ) t 
where itemRecord = 'Use' and itemDate = max_itemdate; 
2

あなたは最新のを取得するためにItemDateによってItemIdと順序にINGのROW_NUMBER()PARTITIONでこれを行うことができますアイテムのエントリ。そして、唯一の最も最近のためのUseItemRecordを有するものを引き戻す:それを行うには

With Cte As 
(
    Select *, 
      Row_Number() Over (Partition By ItemId Order By ItemDate Desc) As RN 
    From YourTable 
) 
Select Id, ItemId, ItemDate, ItemCompany, ItemRecord 
From Cte 
Where RN = 1 
And  ItemRecord = 'Use'; 
2

一つの方法は、NOT EXISTSを使用することです:

SELECT ID, ItemID, ItemDate, ItemCompany, ItemRecord 
FROM tableName t1 
WHERE ItemRecord = 'Use' 
AND NOT EXISTS 
(
    SELECT 1 
    FROM tableName t2 
    WHERE ItemRecord = 'Void' 
    AND t1.ItemId = t2.ItemId 
    AND t1.ItemDate < t2.ItemDate 
) 
関連する問題