Oracle plsql:在分组语句中获取另一个字段值和聚合值

Oracle plsql:在分组语句中获取另一个字段值和聚合值,oracle,plsql,grouping,Oracle,Plsql,Grouping,我在搞考勤系统。我将员工的交易记录存储在下表中: 我想获得每个员工最早和最新的交易记录,包括他们的日期和类型 我能够使用分组和聚合来获取日期。但是,我不知道如何使用它们获取类型 你能帮我吗 谢谢。您可以尝试使用 这就是第一个和最后一个聚合函数的设计目的 以下是文档的链接: 第一: 最后: 下面是一个例子: SQL> create table my_transactions (id,employee_id,action_date,type) 2 as 3 select 1, 1

我在搞考勤系统。我将员工的交易记录存储在下表中:

我想获得每个员工最早和最新的交易记录,包括他们的日期和类型

我能够使用分组和聚合来获取日期。但是,我不知道如何使用它们获取类型

你能帮我吗

谢谢。

您可以尝试使用


这就是第一个和最后一个聚合函数的设计目的

以下是文档的链接:

第一: 最后:

下面是一个例子:

SQL> create table my_transactions (id,employee_id,action_date,type)
  2  as
  3  select 1, 1, sysdate, 'A' from dual union all
  4  select 2, 1, sysdate-1, 'B' from dual union all
  5  select 3, 1, sysdate-2, 'C' from dual union all
  6  select 4, 1, sysdate-3, 'D' from dual union all
  7  select 5, 2, sysdate-11, 'E' from dual union all
  8  select 6, 2, sysdate-12, 'F' from dual union all
  9  select 7, 2, sysdate-13, 'G' from dual
 10  /

Table created.

SQL> select *
  2    from my_transactions
  3   order by id
  4  /

        ID EMPLOYEE_ID ACTION_DATE         T
---------- ----------- ------------------- -
         1           1 04-07-2011 10:15:07 A
         2           1 03-07-2011 10:15:07 B
         3           1 02-07-2011 10:15:07 C
         4           1 01-07-2011 10:15:07 D
         5           2 23-06-2011 10:15:07 E
         6           2 22-06-2011 10:15:07 F
         7           2 21-06-2011 10:15:07 G

7 rows selected.

SQL> select employee_id
  2       , min(action_date) min_date
  3       , max(type) keep (dense_rank first order by action_date) min_date_type
  4       , max(action_date) max_date
  5       , max(type) keep (dense_rank last order by action_date) max_date_type
  6    from my_transactions
  7   group by employee_id
  8  /

EMPLOYEE_ID MIN_DATE            M MAX_DATE            M
----------- ------------------- - ------------------- -
          1 01-07-2011 10:15:07 D 04-07-2011 10:15:07 A
          2 21-06-2011 10:15:07 G 23-06-2011 10:15:07 E

2 rows selected.
问候,

Rob.

这比使用聚合函数FIRST和LAST的效率要低@Rob van Wijk:是否也可以在同一语句中获取员工特定类型的第一个/最后一个事务???@Akram Shahda:当然可以。@Rob van Wijk:请提示!!你能举个确切的例子说明你想要什么吗?我问“确切”。哦,好吧,让我们猜猜:min(解码(类型,'A',动作类型))和max(解码(类型,'A',动作类型日期))?
SQL> create table my_transactions (id,employee_id,action_date,type)
  2  as
  3  select 1, 1, sysdate, 'A' from dual union all
  4  select 2, 1, sysdate-1, 'B' from dual union all
  5  select 3, 1, sysdate-2, 'C' from dual union all
  6  select 4, 1, sysdate-3, 'D' from dual union all
  7  select 5, 2, sysdate-11, 'E' from dual union all
  8  select 6, 2, sysdate-12, 'F' from dual union all
  9  select 7, 2, sysdate-13, 'G' from dual
 10  /

Table created.

SQL> select *
  2    from my_transactions
  3   order by id
  4  /

        ID EMPLOYEE_ID ACTION_DATE         T
---------- ----------- ------------------- -
         1           1 04-07-2011 10:15:07 A
         2           1 03-07-2011 10:15:07 B
         3           1 02-07-2011 10:15:07 C
         4           1 01-07-2011 10:15:07 D
         5           2 23-06-2011 10:15:07 E
         6           2 22-06-2011 10:15:07 F
         7           2 21-06-2011 10:15:07 G

7 rows selected.

SQL> select employee_id
  2       , min(action_date) min_date
  3       , max(type) keep (dense_rank first order by action_date) min_date_type
  4       , max(action_date) max_date
  5       , max(type) keep (dense_rank last order by action_date) max_date_type
  6    from my_transactions
  7   group by employee_id
  8  /

EMPLOYEE_ID MIN_DATE            M MAX_DATE            M
----------- ------------------- - ------------------- -
          1 01-07-2011 10:15:07 D 04-07-2011 10:15:07 A
          2 21-06-2011 10:15:07 G 23-06-2011 10:15:07 E

2 rows selected.