2017-09-27 20 views
0

在與最新的最新記錄是表中的記錄的例子 -的Oracle SQL - 獲取有關非唯一數據

ITEM_NAME STORAGE_CODE STOCK DATE 
ABC   2233   170  27/09/2017 
ABC   2233   270  15/09/2017 
DEF   2233   120  23/09/2017 
DEF   2233   110  11/09/2017 
GHI   2233   50  15/09/2017 

預期結果:

ITEM_NAME STORAGE_CODE STOCK DATE 
ABC   2233   170  27/09/2017 
DEF   2233   120  23/09/2017 
GHI   2233   50  15/09/2017 

我使用下面的嘗試查詢:

Select ITEM_NAME, STORAGE_CODE, STOCK, MAX(DATE) 
FROM ITEM_TABLE 
WHERE ITEM_NAME IN ('ABC','DEF','GHI' .........) 
GROUP BY ITEM_NAME, STORAGE_CODE, STOCK 

由於股票價值不是唯一的,因此這不起作用。

請注意:我使用ITEM_NAME IN(),因爲我需要某些特定項目的輸出。

回答

0

您可以添加select toporder by你的查詢,如果你只是想獲得max日期,就像這樣:

SELECT TOP 1 
     ITEM_NAME, 
     STORAGE_CODE, 
     STOCK, 
     MAX(DATE) 
FROM ITEM_TABLE 
WHERE ITEM_NAME IN('ABC', 'DEF', 'GHI') 
GROUP BY ITEM_NAME, 
     STORAGE_CODE, 
     STOCK 
ORDER BY DATE DESC 

編輯:使用ROW_NUM

SELECT T.ITEM_NAME, 
     T.STORAGE_CODE, 
     T.STOCK, 
     T.DATE 
FROM 
(
    SELECT ITEM_NAME, 
      STORAGE_CODE, 
      STOCK, 
      DATE, 
      ROW_NUMBER() OVER(PARTITION BY ITEM_NAME, 
              STORAGE_CODE ORDER BY DATE DESC) AS part 
    FROM ITEM_TABLE 
    WHERE ITEM_NAME IN('ABC', 'DEF', 'GHI') 
) T 
WHERE part = 1; 
+0

按我的理解,頂部不會在甲骨文工作。 –

+0

ahhh,沒有趕上Oracle的標籤。你可以使用'where rownum = 1'或者使用'rank()'函數來查看 – dbajtr

+0

對不起,但是即使我用'rownum'而不是'TOP',那隻會給我1條記錄(例如:只有ABC記錄)我需要輸出所有項目的記錄(ABC,DEF,GHI)。如果我錯了,請糾正。 –

0

我覺得像一個查詢這應該工作:

select 
    * 
from (
    select *, 
     row_number() over (partition by ITEM_NAME, STORAGE_CODE order by DATE desc) as seq 
    from ITEM_TABLE 
    where ITEM_NAME in ('ABC','DEF','GHI' .........) 
) t 
where seq = 1 
0

您可以使用Oracle row_number() over(partition by)像以下

select ITEM_NAME 
    , STORAGE_CODE 
    , STOCK 
    , DATE 
from 
(
    select ITEM_NAME 
     , STORAGE_CODE 
     , STOCK 
     , DATE 
     , row_number() over(partition by ITEM_NAME order by DATE desc) as rn 
    from ITEM_TABLE 
) s 
where rn = 1 
0

的一種方法是,從在內部查詢DATE1柱得到max值並如下使用join在外部查詢對應stock值。

SELECT t.* 
    ,t1.STOCK 
FROM (
    SELECT ITEM_NAME 
     ,STORAGE_CODE 
     ,MAX(DATE1) AS DATE1 
    FROM table1 
    GROUP BY ITEM_NAME 
     ,STORAGE_CODE 
    ORDER BY ITEM_NAME 
    ) t 
INNER JOIN table1 t1 ON t.ITEM_NAME = t1.ITEM_NAME 
    AND t.STORAGE_CODE = t1.STORAGE_CODE 
    AND t.DATE1 = t1.DATE1 

結果:

ITEM_NAME STORAGE_CODE   DATE1   STOCK 
------------------------------------------------------ 
ABC   2233  27.09.2017 00:00:00  170 
DEF   2233  23.09.2017 00:00:00  120 
GHI   2233  15.09.2017 00:00:00  50 

DEMO