获取每年或项目的最大日期记录

时间:2014-08-26 13:20:59

标签: sql oracle

我的下表包含以下数据。这张表中有近七年的数据。每个项目至少有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

任何帮助将不胜感激。感谢

2 个答案:

答案 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

希望这是你正在寻找的。