Oracle SQL-如何获取具有最长日期的记录的分配id

Oracle SQL-如何获取具有最长日期的记录的分配id,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我正在尝试获取该职位最后一位任职者的员工的分配id。这将是最后一个拥有该职位或最长日期的任务。如何在下面的查询中检索两者 select max(to_char(paaf.effective_start_date, 'yyyymmdd')) || to_char(paaf.assignment_id) from apps.per_all_assignments_f paaf where paaf.position_id = 159841 and paaf.assignment_typ

我正在尝试获取该职位最后一位任职者的员工的分配id。这将是最后一个拥有该职位或最长日期的任务。如何在下面的查询中检索两者

select max(to_char(paaf.effective_start_date, 'yyyymmdd')) || to_char(paaf.assignment_id)
from   apps.per_all_assignments_f paaf
where  paaf.position_id = 159841 
and    paaf.assignment_type in ('E', 'C')
and    paaf.primary_flag = 'Y'
我正在将最大日期转换为一个字符,以便在结果中对其进行子串处理。

试试这个

select (paaf.assignment_id)
from   apps.per_all_assignments_f paaf
where  paaf.position_id = 159841 
and    paaf.primary_flag = 'Y'
UNION all
select (paaf.assignment_id)
from   apps.per_all_assignments_f paaf
where paaf.assignment_type in ('E', 'C')
and    paaf.primary_flag = 'Y'
AND paaf.effective_start_date = (select max(paaf.effective_start_date) from   apps.per_all_assignments_f paaf
where paaf.assignment_type in ('E', 'C')
and    paaf.primary_flag = 'Y')

据我所知,您无法获得聚合函数返回的结果行的另一个值,您需要使用子查询。我认为你应该这样做:

select to_char(paaf.effective_start_date, 'yyyymmdd') || to_char(paaf.assignment_id)
from apps.per_all_assignments_f paaf
where max(to_char(paaf.effective_start_date, 'yyyymmdd')) = 
     (
         select max(to_char(paaf2.effective_start_date, 'yyyymmdd'))
         from   apps.per_all_assignments_f paaf2
         where  paaf2.position_id = 159841 
         and paaf2.assignment_type in ('E', 'C')
         and paaf2.primary_flag = 'Y'
     )

使用窗口函数可以轻松解决此类问题:

select * 
from (
  select paaf.*, 
         max(paaf.effective_start_date) over (partition by position_id) as max_start_date
  from   apps.per_all_assignments_f paaf
  where  paaf.position_id = 159841 
  and    paaf.assignment_type in ('E', 'C')
  and    paaf.primary_flag = 'Y'  
) t
where effective_start_date = max_start_date;
作为max\u start\u date的部分
max(paaf.effective\u start\u date)(按位置id划分)本质上与
max(paaf.effective\u start\u date)相同。。。按位置分组\u id
,但不需要对整个结果进行分组


由于您仅选择一个
位置\u id
,因此可以使用
over()
,但通过使用
over(按位置\u id划分)
查询也可以用于检索多个位置的信息。

如果您只需要一个id:

SELECT  to_char(effective_start_date, 'yyyymmdd') || to_char(assignment_id)
FROM (
  select effective_start_date,
         assignment_id
  from   apps.per_all_assignments_f
  where  position_id = 159841 
  and    assignment_type in ('E', 'C')
  and    primary_flag = 'Y'
  ORDER BY effective_start_date DESC
)
WHERE ROWNUM = 1;
如果需要与最新日期关联的所有ID,则:

SELECT  to_char(effective_start_date, 'yyyymmdd') || to_char(assignment_id)
FROM (
  select effective_start_date,
         assignment_id,
         RANK() OVER ( ORDER BY effective_start_date DESC ) AS rnk
  from   apps.per_all_assignments_f
  where  position_id = 159841 
  and    assignment_type in ('E', 'C')
  and    primary_flag = 'Y'
  ORDER BY effective_start_date DESC
)
WHERE RNK = 1;

这里有一个替代方案,它不需要子查询或分析函数来查找您要查找的值:

select to_char(max_effective_start_date, 'yyyymmdd') || to_char(max_row_assignment_id)
from   (select max(paaf.effective_start_date) max_effective_start_date,
               max(paaf.assignment_id) keep (dense_rank first order by effective_start_date desc) max_row_assignment_id
        from   apps.per_all_assignments_f paaf
        where  paaf.position_id = 159841 
        and    paaf.assignment_type in ('E', 'C')
        and    paaf.primary_flag = 'Y');

这是错误的,因为我们可以通过分析函数
max(to_char(paaf.effective_start_date,'yyyyymmdd'))在(按***分区)上获得此聚合。
这也是错误的,因为您可以使用该函数从其他列检索相应的值,例如。,具有最大日期的行。这不是单个query@Superdooperhero你说这不是一个问题是什么意思?对我来说,它看起来像一个…这并没有给我最大有效开始日期的分配idfor@Superdooperhero这是怎么回事?它提供了有效开始日期最高的行,然后您可以轻松地选择感兴趣的列。也许你应该考虑更新你的问题,以提供一些样本数据和预期输出,这样,试图帮助你的人实际上可以对某些实际数据运行他们的查询,不必猜测您的意思。@superdooperho查询返回完整的行,其中给定的
位置\u id
生效\u开始\u日期
是最高的。如果该行不包含您正在查找的作业id,则需要提供一些示例数据(编辑您的问题,不要将该信息作为注释发布)。理想情况下,
插入到
语句中,或者作为一个示例,我正在查找与最大日期对应的id如果您正在查找单个id,那么使用
ROWNUM
的选项将给出该id。