在oracle上具有最大日期查询的非重复记录

时间:2016-02-24 18:53:19

标签: sql oracle duplicates max

您好我的简单查询有问题。我需要查看两个直接站点中某些文章的最长日期。

这是我的实际查询:

SELECT a.aa_codart, MAX(t.tr_fechafac), t.tr_tipo
FROM ARTALM a, traspaso t
WHERE t.tr_codart = a.aa_codart
and t.tr_tipomov > 1
and a.aa_codalm = '1'
and (t.tr_tipo >= 1 and t.tr_tipo <=2)
group by a.aa_codart, t.tr_tipo;

结果:

01..FRB10X80    30/11/07    2
01..FRB10X80    08/03/01    1
01.32122RS      05/02/16    1
01.32122RS      02/07/10    2
01.33052Z       21/09/15    1
01.60042Z       24/02/16    2

我希望,例如在前两行中,只能看到一行,如下所示:

01..FRB10X80    30/11/07    2
01.32122RS      05/02/16    1
01.33052Z       21/09/15    1
01.60042Z       24/02/16    2

取最大日期

由于

2 个答案:

答案 0 :(得分:1)

这需要分析查询。此查询显示ROW_NUMBER()函数如何将值1分配给文章最近日期的行。首先尝试帮助理解最终查询,接下来出现:

SELECT
  a.aa_codart,
  t.tr_fechafac,
  t.tr_tipo,
  ROW_NUMBER() OVER (PARTITION BY a.aa_codart ORDER BY t.tr_fechafac DESC) as rnk
FROM artalm a
INNER JOIN trapaso t ON a.aa_codart = t.tr_codart
WHERE t.tr_tipomov > 1
  AND a.aa_codalm = '1'
  AND t.tr_tipo BETWEEN 1 AND 2

您无法将WHERE子句应用于rnk列,因为该列是在 WHERE子句之后计算的。你可以使用嵌套查询来解决这个问题:

SELECT * FROM (
  SELECT
    a.aa_codart,
    t.tr_fechafac,
    t.tr_tipo,
    ROW_NUMBER() OVER (PARTITION BY a.aa_codart ORDER BY t.tr_fechafac DESC) as rnk
  FROM artalm a
  INNER JOIN trapaso t ON a.aa_codart = t.tr_codart
  WHERE t.tr_tipomov > 1
    AND a.aa_codalm = '1'
    AND t.tr_tipo BETWEEN 1 AND 2
) WHERE rnk = 1;

我提前为任何可能重新输入错误的列名道歉。 Oracle语法应该没问题;列名可能不是那么多:)

答案 1 :(得分:0)

我想你可能想看看row_number()(然后只选择那里的那个)这样的东西。

WITH t
     AS (SELECT 'A' aa_codart,
                TO_DATE ('17/05/00', 'dd/mm/yy') mydt,
                1 tr_tipo
           FROM DUAL
         UNION ALL
         SELECT 'A', TO_DATE ('12/04/00', 'dd/mm/yy'), 2 FROM DUAL
         UNION ALL
         SELECT 'B', TO_DATE ('30/06/98', 'dd/mm/yy'), 2 FROM DUAL
         UNION ALL
         SELECT 'C', TO_DATE ('30/06/98 ', 'dd/mm/yy'), 2 FROM DUAL),
     t2
     AS (SELECT aa_codart,
                mydt,
                tr_tipo,
                ROW_NUMBER ()
                   OVER (PARTITION BY aa_codart ORDER BY mydt DESC)
                   rn
           FROM t)
SELECT *
  FROM t2
 WHERE rn = 1