如何选择最后的数据?Oracle



列出Employees * * Invoice.

<>之前员工 : 发票:Id_emp名称id_发票id_发票日期------------------------------- ------------------------------彼得前书5:5 01.01.2014 10:562阿尔弗雷德6 6 02.04.2014 11:213杰克7 7 2014年3月9日12:322 Alfred 8 8 10.10.2014 16:43之前

如何获得所有员工和他们唯一的最后发票,即以以下形式:

<>之前Id_emp名称id_invoice日期_invoice------------------------------------------------------彼得前书5:01 . 1 2014 10:563杰克2014年3月9日12:322 Alfred 8 10.10.2014 16:43之前

I tried to do:

SELECT id_emp, name, emp.id_invoice, max(date_invoice) as date_invoice 
   FROM Employees emp, Invoice inv 
     WHERE emp.id_invoice = inv.id_invoice GROUP BY id_emp, name, emp.id_invoice;

下面的查询将帮助您。还需要对id_invoice进行分组。

SELECT id_emp, name, MAX(emp.id_invoice) AS id_invoice, 
  max(date_invoice) as date_invoice 
FROM Employees emp, Invoice inv 
WHERE emp.id_invoice = inv.id_invoice GROUP BY id_emp, name;

当您执行GROUP BY并且需要包含来自"最后"发票的更多列时,KEEP语法可以非常方便:

with employees as (
   select 1 id_emp, 'Peter' name, 5 id_invoice from dual
   union all
   select 2, 'Alfred', 6 from dual
   union all
   select 3, 'Jack', 7 from dual
   union all
   select 2, 'Alfred', 8 from dual
), invoice as (
   select 5 id_invoice, to_date('01.01.2014 10:56','DD-MM-YYYY HH24:MI') date_invoice from dual
   union all
   select 6, to_date('02.04.2014 11:21','DD-MM-YYYY HH24:MI')from dual
   union all
   select 7, to_date('03.09.2014 12:32','DD-MM-YYYY HH24:MI')from dual
   union all
   select 8, to_date('10.10.2014 16:43','DD-MM-YYYY HH24:MI')from dual
)
select emp.id_emp
     , max(emp.name) name
     , max(inv.id_invoice) keep (dense_rank last order by inv.date_invoice) last_id_invoice
     , max(inv.date_invoice) last_date_invoice
  from employees emp
  join invoice inv
      on inv.id_invoice = emp.id_invoice
 group by emp.id_emp
 order by emp.id_emp

按id_emp分组。(我假设id_emp是主键,而emp.name是多余的,因此我使用max(name) -如果id_emp不是键,则将其包含在组中。)

我们使用普通max()函数获得的最后一个发票日期。获取具有最后日期的发票的id_invoice是通过KEEP语法完成的-使用DENSE_RANK last order通过inv.date_invoice告诉max(inv.id_invoice)函数它应该只取具有last date_invoice的那些行的max()。

另一种方法是使用解析函数,例如:

with employees as (
   select 1 id_emp, 'Peter' name, 5 id_invoice from dual
   union all
   select 2, 'Alfred', 6 from dual
   union all
   select 3, 'Jack', 7 from dual
   union all
   select 2, 'Alfred', 8 from dual
), invoice as (
   select 5 id_invoice, to_date('01.01.2014 10:56','DD-MM-YYYY HH24:MI') date_invoice from dual
   union all
   select 6, to_date('02.04.2014 11:21','DD-MM-YYYY HH24:MI')from dual
   union all
   select 7, to_date('03.09.2014 12:32','DD-MM-YYYY HH24:MI')from dual
   union all
   select 8, to_date('10.10.2014 16:43','DD-MM-YYYY HH24:MI')from dual
)
select id_emp, name, id_invoice, date_invoice
  from (
   select emp.id_emp
        , emp.name
        , inv.id_invoice
        , inv.date_invoice
        , row_number() over (
             partition by emp.id_emp
             order by inv.date_invoice desc
          ) rn
     from employees emp
     join invoice inv
         on inv.id_invoice = emp.id_invoice
  )
 where rn = 1
 order by id_emp

这两种方法的优点都是不能多次访问表。第二种方法使用解析的row_number()函数是最简单的,如果您需要从"最后"行开始的许多列——在这种情况下,KEEP方法需要在许多列中复制相同的KEEP子句。

给你

    SELECT id_emp, name, emp.id_invoice, max(date_invoice) as date_invoice 
       FROM Employees emp , Invoice inv 
    WHERE 
emp.id_emp = inv.id_emp 
AND inv_id_invoice = (
      SELECT MAX(id_invoice) from Invoices c where c.id_emp = inv.id_emp
)

您需要获取最新的发票编号而不是最新的发票日期,因为同一天可以有两张发票

根据你们的数据,你们可以根据发票号来识别最新的发票。试试这个:-

SELECT id_emp, name, max(emp.id_invoice), date_invoice
FROM Employees emp, Invoice inv 
WHERE emp.id_invoice = inv.id_invoice GROUP BY id_emp, name, date_invoice;

一种方法是对发票进行rank:

SELECT id_emp, name, id_invoice
FROM   (SELECT id_emp, name, emp.id_invoice, 
               RANK()  (ORDER BY date_invoice PARTITION BY id_emp) AS rk
        FROM   Employees emp
        JOIN   Invoice inv ON emp.id_invoice = inv.id_invoice)
WHERE  rk = 1

最新更新