Sql 如何获取其他表中不存在的值,忽略具有最新日期的重复值
在给定ff的情况下,如何仅获取表A中不存在于表B中的水平_20值。情景: 如果带有代码\u级别\u 20的奖品在A中具有相同的级别\u 20值,请忽略它! 如果有多个奖励值,请将该值与B中的最大日期进行比较 表A 表B 表C 预期产出: 我的错误代码:Sql 如何获取其他表中不存在的值,忽略具有最新日期的重复值,sql,oracle,not-exists,Sql,Oracle,Not Exists,在给定ff的情况下,如何仅获取表A中不存在于表B中的水平_20值。情景: 如果带有代码\u级别\u 20的奖品在A中具有相同的级别\u 20值,请忽略它! 如果有多个奖励值,请将该值与B中的最大日期进行比较 表A 表B 表C 预期产出: 我的错误代码: 由于预期的输出和表中的数据,使用此查询而不包括表b已足够: with a(ALIAS, LEVEL_20, POINTS, "DATE") as ( select 'Jbax',300,325,date'2018-06-20' from dua
由于预期的输出和表中的数据,使用此查询而不包括表b已足够:
with a(ALIAS, LEVEL_20, POINTS, "DATE") as
(
select 'Jbax',300,325,date'2018-06-20' from dual union all
select 'Cvg2',100,103,date'2018-06-20' from dual union all
select 'Deg1',200,281,date'2018-06-20' from dual
), b(ALIAS, CODE_LEVEL, PRIZE, "DATE") as
(
select 'Jbax','Level_20',500,date'2017-01-15' from dual union all
select 'Jbax','Level_10',200,date'2017-03-20' from dual union all
select 'Cvg2','Level_20',100,date'2017-04-05' from dual union all
select 'Deg1',null,null,null from dual union all
select 'Cvg2','Level_20',50,date'2017-02-01' from dual
), c(ALIAS,NAME) as
(
select 'Jbax','Jessie' from dual union all
select 'Cvg2','Carol' from dual union all
select 'Deg1','Danny' from dual
)
select c.name, a.level_20
from c
join a on a.alias = c.alias
where (a.alias,a.level_20) not in
(select a.alias,b.prize
from a
join b on b.prize = a.level_20 and b.code_level = 'Level_20');
NAME LEVEL_20
------ --------
Jessie 300
Danny 200
另外,表b中没有多个奖项
由于预期的输出和表中的数据,使用此查询而不包括表b已足够:
with a(ALIAS, LEVEL_20, POINTS, "DATE") as
(
select 'Jbax',300,325,date'2018-06-20' from dual union all
select 'Cvg2',100,103,date'2018-06-20' from dual union all
select 'Deg1',200,281,date'2018-06-20' from dual
), b(ALIAS, CODE_LEVEL, PRIZE, "DATE") as
(
select 'Jbax','Level_20',500,date'2017-01-15' from dual union all
select 'Jbax','Level_10',200,date'2017-03-20' from dual union all
select 'Cvg2','Level_20',100,date'2017-04-05' from dual union all
select 'Deg1',null,null,null from dual union all
select 'Cvg2','Level_20',50,date'2017-02-01' from dual
), c(ALIAS,NAME) as
(
select 'Jbax','Jessie' from dual union all
select 'Cvg2','Carol' from dual union all
select 'Deg1','Danny' from dual
)
select c.name, a.level_20
from c
join a on a.alias = c.alias
where (a.alias,a.level_20) not in
(select a.alias,b.prize
from a
join b on b.prize = a.level_20 and b.code_level = 'Level_20');
NAME LEVEL_20
------ --------
Jessie 300
Danny 200
另外,表b中没有多个奖项
这将为您提供预期的结果:
with get_max_value as
(
select b2.*, max(b2."DATE") over (partition by b2.ALIAS) mdate from b b2
)
select my_c.name, my_a.level_20
from c my_c join a my_a on my_a.alias = my_c.alias
where (my_a.alias,my_a.level_20) not in
(select a2.alias, gmv.prize
from a a2 join get_max_value gmv on gmv.prize = a2.level_20
and gmv.code_level = 'Level_20'
WHERE gmv."DATE" = gmv.mdate);
我想你的意思是相同的别名,而不是相同的价格。在我看来,相同的价格毫无意义,所以我只是用相同的别名分组。如果您需要最高价格,那么其他答案中的建议就可以了。这将为您提供预期结果:
with get_max_value as
(
select b2.*, max(b2."DATE") over (partition by b2.ALIAS) mdate from b b2
)
select my_c.name, my_a.level_20
from c my_c join a my_a on my_a.alias = my_c.alias
where (my_a.alias,my_a.level_20) not in
(select a2.alias, gmv.prize
from a a2 join get_max_value gmv on gmv.prize = a2.level_20
and gmv.code_level = 'Level_20'
WHERE gmv."DATE" = gmv.mdate);
我想你的意思是相同的别名,而不是相同的价格。在我看来,相同的价格毫无意义,所以我只是用相同的别名分组。如果您需要最高价格,那么其他答案中的建议也可以。此查询在表b中添加排序: 结果:
ALIAS LEVEL_20 NAME CODE_LEVEL PRIZE DATE_ RN
----- ---------- ------ ---------- ---------- ----------- ----------
Cvg2 100 Carol Level_20 100 2017-04-05 1
Cvg2 100 Carol Level_20 50 2017-02-01 2
Deg1 200 Danny 1
Jbax 300 Jessie Level_20 500 2017-01-15 1
pqrs 100 Peter Level_20 200 2017-04-05 1
pqrs 100 Peter Level_20 100 2017-02-01 2
因此,现在您只能获取最新rn=1的行,这些行的prize为空,或者prize与a.level_20不同:
我在那里添加了一行此查询在表b中添加排序: 结果:
ALIAS LEVEL_20 NAME CODE_LEVEL PRIZE DATE_ RN
----- ---------- ------ ---------- ---------- ----------- ----------
Cvg2 100 Carol Level_20 100 2017-04-05 1
Cvg2 100 Carol Level_20 50 2017-02-01 2
Deg1 200 Danny 1
Jbax 300 Jessie Level_20 500 2017-01-15 1
pqrs 100 Peter Level_20 200 2017-04-05 1
pqrs 100 Peter Level_20 100 2017-02-01 2
因此,现在您只能获取最新rn=1的行,这些行的prize为空,或者prize与a.level_20不同:
我在那里添加了一行谢谢,但我所说的多重奖励值是指Cvg2在表b中有100和50-我想将a中的20级值与表b中的最大日期进行比较。假设我将Cvg2从表b中的100和50更改为200和100,您的代码将排除Carol-但她必须在输出中,因为200 b的最大日期为100 aThanks,但我所说的多重奖励值,Cvg2在表b中有100和50-在这种情况下,我想将a中的水平_20值与表b中的最大日期进行比较。假设我将Cvg2从表b中原来的100和50更改为200和100,表b中的日期相同,您的代码将排除Carol-但她必须在输出中,因为200 b的最大日期为100,这正是我所需要的,谢谢,我很高兴您理解了我的要求!正是我需要的,谢谢我很高兴你理解我的要求!
with get_max_value as
(
select b2.*, max(b2."DATE") over (partition by b2.ALIAS) mdate from b b2
)
select my_c.name, my_a.level_20
from c my_c join a my_a on my_a.alias = my_c.alias
where (my_a.alias,my_a.level_20) not in
(select a2.alias, gmv.prize
from a a2 join get_max_value gmv on gmv.prize = a2.level_20
and gmv.code_level = 'Level_20'
WHERE gmv."DATE" = gmv.mdate);
select a.alias, a.level_20, c.name, b.code_level, b.prize, b.date_,
row_number() over (partition by a.alias, c.name order by b.date_ desc) rn
from a join c on c.alias = a.alias
left join b on b.alias = a.alias and b.code_level = 'Level_20'
ALIAS LEVEL_20 NAME CODE_LEVEL PRIZE DATE_ RN
----- ---------- ------ ---------- ---------- ----------- ----------
Cvg2 100 Carol Level_20 100 2017-04-05 1
Cvg2 100 Carol Level_20 50 2017-02-01 2
Deg1 200 Danny 1
Jbax 300 Jessie Level_20 500 2017-01-15 1
pqrs 100 Peter Level_20 200 2017-04-05 1
pqrs 100 Peter Level_20 100 2017-02-01 2
select name, level_20
from (
select a.alias, a.level_20, c.name, b.code_level, b.prize, b.date_,
row_number() over (partition by a.alias, c.name order by b.date_ desc) rn
from a join c on c.alias = a.alias
left join b on b.alias = a.alias and b.code_level = 'Level_20')
where rn = 1 and (prize is null or prize <> level_20)