oracle—如何按特定日期和另一个标识符对数据进行分区

7gcisfzg  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(299)
with cte as
(
    select to_date('01-JUN-2020','DD-MON-YYYY')+(level-1) DT
    from dual
    connect bY level<= 30
)
select * 
from cte x
left outer join 
    (select date from time where emp in (1, 2)) a on x.dt = a.date

在这种情况下,我试图找到失踪的日子,这些人没有报告工作。。。适合一个人。我正确地找回了他们失踪的日子。但是当我加上两个人。。我没有为他们找回正确的错过的日子,因为我想我只是在约会的时候加入。
我想知道我如何能分区这个数据的人id和日期,以便能够得到准确的日子,每一个失踪。
请帮忙,谢谢。

rn0zuynd

rn0zuynd1#

你通常会 cross join 日期列表与人员列表,然后使用 not exists 要提取失踪人员/日期元组:

with cte as ( 
    select date '2020-06-01' + level - 1 dt
    from dual 
    connect by level <= 30 
)
select c.dt, e.emp
from cte c
cross join (select distinct emp from times) e
where not exists (
    select 1
    from times t
    where t.emp = e.emp and t.dt = e.date
)

请注意,这使用的是文字日期,而不是 to_date() ,在这里更合适。
这将同时为所有人提供丢失的元组。如果只需要预定义的人员列表,则:

with cte as ( 
    select date '2020-06-01' + level - 1 dt
    from dual 
    connect by level <= 30 
)
select c.dt, e.emp
from cte c
cross join (select 1 emp from dual union all select 2 from dual) e
where not exists (
    select 1
    from times t
    where t.emp = e.emp and t.dt = e.date
)

如果您还想查看“状态”日期,则使用 left join 而不是 not exists ,如原始查询中所示:

with cte as ( 
    select date '2020-06-01' + level - 1 dt
    from dual 
    connect by level <= 30 
)
select c.dt, e.emp, -- enumerate the relevant columns from "t" here
from cte c
cross join (select 1 emp from dual union all select 2 from dual) e
left join times t on t.emp = e.emp and t.dt = e.date

相关问题