从列的最大值查找结束日期的ORacle SQL查询

从列的最大值查找结束日期的ORacle SQL查询,sql,oracle,Sql,Oracle,e、 g。 我的表包含如下所示的记录 EmpName Paycode ApplyDate Amt. of Hrs emp1 vacation 5/1/2010 8 emp1 vacation 5/2/2010 8 emp1 vacation 5/3/2010

e、 g。 我的表包含如下所示的记录

EmpName       Paycode      ApplyDate            Amt. of Hrs
emp1          vacation      5/1/2010                     8
emp1          vacation      5/2/2010                     8
emp1          vacation      5/3/2010                     8
我试图得到这样的输出

Emp Name  Paycode      Leave Start Date    Leave End Date    TotalHrs
emp1      vacation         5/1/2010           5/3/2010           24
有人能帮我修一下吗

谢谢
Mart

如果您希望获得更复杂的数据,并且只累计连续的天数(如@Dan在评论中提到的),那么您将需要一个更复杂的查询

下面显示了一些可能解决您问题的方法。这是对源代码的修改


如果您希望拥有更复杂的数据,并且只累计连续的天数(如@Dan在评论中提到的),那么您将需要一个更复杂的查询

下面显示了一些可能解决您问题的方法。这是对源代码的修改



根据您的表格,一名员工可能有多个相同工资代码的条目,例如“emp1有2组假期”。您的应用程序是否支持这种可能性?如果您的测试数据对同一员工和薪资代码有另一个条目,但申请日期为2010年7月5日(例如,另一个假期),那么应该如何报告?我认为您的报告只希望将连续工作日分组到同一个聚合报告行中。@同样,是的,您是正确的。。一个emp可以包含多组记录。这类似于如果您在5月休假一周,在8月休假另一周,如果用户想查看您全年的假期历史记录,显然您的所有假期都应该作为输出。@Dan说另一个例子……如果emp2的假期期限为2010年7月5日至2010年7月9日,那么我的输出应该是emp2 |假期| 2010年7月5日| 2010年7月9日| 40根据您的表格,似乎一名员工可能有多个相同工资代码的条目,例如“emp1有两组假期”。您的应用程序是否支持这种可能性?如果您的测试数据对同一员工和薪资代码有另一个条目,但申请日期为2010年7月5日(例如,另一个假期),那么应该如何报告?我认为您的报告只希望将连续工作日分组到同一个聚合报告行中。@同样,是的,您是正确的。。一个emp可以包含多组记录。这类似于如果您在5月休假一周,在8月休假另一周,如果用户想查看您全年的假期历史记录,显然您的所有假期都应该作为输出。@Dan说另一个例子,例如……如果emp2的假期期限为2010年7月5日至2010年7月9日,那么我的输出应该是emp2 |休假| 7/5/2010 | 7/9/2010 |40@MikeyByCrikey...do除了上面的代码,我还需要更多的代码块吗?上述代码不返回任何行。谢谢你的努力。@Mahadevan:这些应该都能用,不需要额外的钱。在10.2.0.4中为我返回三行。你有什么错误吗?@Mahadevan我刚改成评论格式。可能会更好。从IE复制出来的一行代码导致了问题。不过Firefox没有问题。。。奇怪。@MikeyByCrikey:如果我想对整个表运行'with'子句定义,我需要保留它吗?@Madadevan:删除
with
子句,因为它只是提供一些示例数据。用表名替换
test\u数据
。然后从查询的最低子查询开始,看看从那里得到了什么。追踪问题。当查询为我工作时,我真的无法帮助调试它,而且除了说它不返回行之外,我没有从您那里得到太多信息。@MikeyByCrikey…除了上面的代码之外,我还需要更多的代码块吗?上述代码不返回任何行。谢谢你的努力。@Mahadevan:这些应该都能用,不需要额外的钱。在10.2.0.4中为我返回三行。你有什么错误吗?@Mahadevan我刚改成评论格式。可能会更好。从IE复制出来的一行代码导致了问题。不过Firefox没有问题。。。奇怪。@MikeyByCrikey:如果我想对整个表运行'with'子句定义,我需要保留它吗?@Madadevan:删除
with
子句,因为它只是提供一些示例数据。用表名替换
test\u数据
。然后从查询的最低子查询开始,看看从那里得到了什么。追踪问题。当查询对我起作用时,我真的无法帮助调试它,并且除了说它不返回行之外,我没有从您那里获得太多信息。这将“跳转”多个假期中的间隔。这将“跳转”多个假期中的间隔。
select
  empname
  , paycode
  , min(applyDate) as leave_start_date
  , max(applyDate) as leave_end_date
  , sum(amt_of_hrs) as total_hours
from TableEmp
group by empname, paycode
WITH test_data AS (
  SELECT  'emp1' as empname, 'vacation' as paycode, date '2010-05-01' as applydate, 8 as numhours from dual union all
  SELECT  'emp1' as empname, 'vacation' as paycode, date '2010-05-02' as applydate, 8 as numhours from dual union all
  SELECT  'emp1' as empname, 'vacation' as paycode, date '2010-05-03' as applydate, 8 as numhours from dual union all
  SELECT  'emp2' as empname, 'vacation' as paycode, date '2010-05-01' as applydate, 8 as numhours from dual union all
  SELECT  'emp2' as empname, 'vacation' as paycode, date '2010-05-02' as applydate, 8 as numhours from dual union all
  SELECT  'emp1' as empname, 'vacation' as paycode, date '2010-07-05' as applydate, 8 as numhours from dual 
)
select 
      empname,
      paycode,
      min(applydate) as startdate,
      max(applydate) as startdate,
      sum(numhours) as toalhours
from ( 
  select 
      empname,
      paycode,
      applydate,
      numhours,
/* number the blocks sequentially */
    sum(is_block_start) over (partition by empname, paycode order by applydate) as block_num
  from ( 
    select 
      empname,
      paycode,
      applydate,
      numhours,
/* Mark the start of each block */
      case 
        when applydate = prev_applydate + 1 then 0 else 1 end as is_block_start
    from ( 
      select 
        empname,
        paycode,
        applydate,
        numhours,
        lag(applydate) over (partition by empname, paycode order by applydate) prev_applydate
      from test_data
    )
  )
)
group by empname, paycode, block_num