Sql 当oracle中的另一列具有不同的值时,如何选择具有MAX(Column)的行?

Sql 当oracle中的另一列具有不同的值时,如何选择具有MAX(Column)的行?,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我有四个这样的专栏 Material Description Quantity Date a 133 200 26-09-2016 12:33 a 133 400 27-09-2016 10:33 我需要在最大(日期)时从该材料中获取数量 我尝试了这个方法,但如果两行中的数量不同,则显示两行 Select material , description , quantity , max(d

我有四个这样的专栏

Material  Description  Quantity         Date
    a         133       200     26-09-2016 12:33
    a         133       400     27-09-2016 10:33
我需要在最大(日期)时从该材料中获取数量

我尝试了这个方法,但如果两行中的数量不同,则显示两行

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

WHERE
子句中使用该条件,如

Select material , description , quantity 
FROM  materials
WHERE "Date"  = (select max("Date") from materials)
您可以这样使用(如果您需要查找“a”和“b”组中所有材料的数量,我将添加材料b):

使用:


如果有多行具有相同的
材料
和最大
日期
值,则会得到多行-如果您只需要一行,则使用
行编号()
而不是
秩()

在where子句中使用最大日期。Oracle的哪个版本?(始终声明,如果您不知道,请运行
select*from v$version
)在Oracle 12中,您可以使用
fetch first | last
并避免子查询。
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
SELECT *
FROM   (
  SELECT materials,
         description,
         quantity,
         date,
         RANK() OVER ( PARTITION BY materials ORDER BY date DESC ) AS rnk 
  FROM   materials
)
WHERE  rnk = 1;
SELECT *
FROM   (
  SELECT materials,
         description,
         quantity,
         date,
         RANK() OVER ( PARTITION BY materials ORDER BY date DESC ) AS rnk 
  FROM   materials
)
WHERE  rnk = 1;