Oracle SQL - 如何获取具有最大日期的记录的分配 ID
Oracle SQL - How to get the assignment id of the record with the maximum date
我正在尝试获取该职位的最后一位员工的分配 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'
)
类似的问题可以使用 window 函数轻松解决:
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(paaf.effective_start_date) over (partition by position_id) as max_start_date
部分与 max(paaf.effective_start_date) ... group by position_id
部分基本相同,但不需要对整个结果进行分组。
由于您只选择了一个 position_id
,因此您 可以 使用 over ()
代替 - 但通过使用 over (partition by position_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');
我正在尝试获取该职位的最后一位员工的分配 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'
)
类似的问题可以使用 window 函数轻松解决:
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(paaf.effective_start_date) over (partition by position_id) as max_start_date
部分与 max(paaf.effective_start_date) ... group by position_id
部分基本相同,但不需要对整个结果进行分组。
由于您只选择了一个 position_id
,因此您 可以 使用 over ()
代替 - 但通过使用 over (partition by position_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');