我有一张包含大量记录的表格。我正在尝试查询它,但很难确定如何做到这一点....
这是表格的结构
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 - 检查它们是否也跟着第二次使用?如果他们不这样做则根本不显示记录。
答案 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
ItemId
和ItemDate
订购来获取该项目的最新条目。然后只撤回那些最近有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
)