我的下表包含以下数据。这张表中有近七年的数据。每个项目至少有52行数据。
INV_TAB
ITEM_ID END_DATE QUANTITY
-------- ------------ ----------
10 07-JAN-2008 100
10 14-JAN-2008 85
10 21-JAN-2008 60
... ( other 2008 rows )
10 31-DEC-2008 72
... ( 2009, 2010, 2011, 2012 rows )
10 31-DEC-2013 130
10 23-AUG-2014 56
20 07-JAN-2008 10
... ( 2009, 2010, 2011, 2012 rows )
20 31-DEC-2013 2
20 23-AUG-2014 11
...
我似乎无法弄清楚是一个SQL查询(Oracle)来检索特定项目的每一年的所有最终(或最后)行。使用我的结果上面的数据 对于第10项,将返回7行:
ITEM_ID END_DATE QUANTITY
-------- ------------ ----------
10 31-DEC-2008 60
... ( 2009, 2010, 2011, 2012 rows )
10 31-DEC-2013 130
10 23-AUG-2014 56
任何帮助将不胜感激。感谢
答案 0 :(得分:1)
尝试使用ROW_NUMBER()
,如下所示:
SELECT
ITEM_ID
, END_DATE
, QUANTITY
FROM (
SELECT
ITEM_ID
, END_DATE
, QUANTITY
, ROW_NUMBER() OVER (PARTITION BY ITEM_ID, TRUNC(END_DATE, 'YYYY')
ORDER BY END_DATE DESC) AS rn
ORDER BY END_DATE
FROM INV_TAB
)
WHERE rn = 1
ROW_NUMBER()
只发出从1开始增加1的整数.OVER()子句指定何时从1重新开始(分区依据)然后按控制顺序排列数量增加。因此,如果我正确地得到了问题,那么每个年末每个item_id都需要1。
答案 1 :(得分:0)
您可以使用此查询获取每年的最后一行:
SELECT IT.*
FROM INV_TAB IT
INNER JOIN (SELECT I.ITEM_ID
,MAX(I.END_DATE) AS [END_DATE]
FROM INV_TAB I
GROUP BY I.ITEM_ID, DATEPART(YEAR,I.END_DATE)) T ON T.ITEM_ID = IT.ITEM_ID
AND T.END_DATE = IT.END_DATE
希望这是你正在寻找的。 p>