根据标准查询大型数据集(use,void)

时间:2017-01-17 15:44:39

标签: sql sql-server-2012

我有一张包含大量记录的表格。我正在尝试查询它,但很难确定如何做到这一点....

这是表格的结构

 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

所以这是我的问题。我试图找到只有使用过的物品。所以在这种情况下,我希望的最终结果看起来像这样......

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

APPLE有2条记录 - 一条是USE,另一条是VOID - 所以当它无效时它被放回系统 - 因此它没有被使用。另一方面,ADOBE - 使用然后VOID然后USE再次意味着它现在已被使用。

我有没有办法只查询那些有USE的记录 - 但是如果他们有VOID - 检查它们是否也跟着第二次使用?如果他们不这样做则根本不显示记录。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

您可以使用ROW_NUMBER()上的PARTITION ItemIdItemDate订购来获取该项目的最新条目。然后只撤回那些最近有Use ItemRecord的人:

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 :(得分: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
)