2016-08-26 1 views
1

У меня есть четыре столбца, подобные этому.Как выбрать строки с MAX (Column), когда другой столбец имеет разные значения в oracle?

Material Description Quantity   Date 
    a   133  200  26-09-2016 12:33 
    a   133  400  27-09-2016 10:33 

Мне нужно взять количество от этого материала, когда Max (Date);

Я пробовал это, но если количество разных в показывает обе строки.

Select material , description , quantity , max(date) 
FROM materials 
group by material, description , quantity 
+0

использовать максимальную дату в вас, где предложение тогда .. – XING

+0

Какая версия Oracle? (Всегда указывайте это, и если вы не знаете, узнайте, выполнив 'select * from v $ version'.) В Oracle 12 вы можете использовать' fetch first | last' и избегать подзапроса. – mathguy

ответ

2

Используйте это условие в WHERE статье как

Select material , description , quantity 
FROM materials 
WHERE "Date" = (select max("Date") from materials) 
0

вы можете использовать row_number() как это (i'am добавить материал б, если вам нужно найти количество всех материалов в группе «а» и " б "):

WITH a(Material, Description , Quantity , sDate) AS 
    (SELECT 'b', 133, 1200 , to_date('26-09-2016 12:33','dd-mm-yyyy hh24:mi') FROM dual UNION ALL 
    SELECT 'b', 133, 2200 , to_date('29-09-2016 12:33','dd-mm-yyyy hh24:mi') FROM dual UNION ALL 
    SELECT 'a', 133, 200 , to_date('26-09-2016 12:33','dd-mm-yyyy hh24:mi') FROM dual UNION ALL 
    SELECT 'a', 133, 400 , to_date('27-09-2016 10:33','dd-mm-yyyy hh24:mi') FROM dual ) 
SELECT * 
    FROM (SELECT a.*, 
       row_number() over(partition BY material order by sdate DESC) rn 
      FROM a) 
WHERE rn = 1 


MATERIAL DESCRIPTION QUANTITY SDATE    RN 
-------- ----------- ---------- --------- ---------- 
a    133  400 27-SEP-16   1 
b    133  2200 29-SEP-16   1 
1

Используйте RANK() analytic function:

SELECT * 
FROM (
    SELECT materials, 
     description, 
     quantity, 
     date, 
     RANK() OVER (PARTITION BY materials ORDER BY date DESC) AS rnk 
    FROM materials 
) 
WHERE rnk = 1; 

Это приведет к появлению нескольких строк, если есть строки с одинаковыми materials и значениями максимум date. Если вы хотите только одну строку, используйте ROW_NUMBER() вместо RANK().

0
SELECT * 
FROM (
    SELECT materials, 
     description, 
     quantity, 
     date, 
     RANK() OVER (PARTITION BY materials ORDER BY date DESC) AS rnk 
    FROM materials 
) 
WHERE rnk = 1;