sql- 多行相同信息时抑制金额取唯一值
sql- suppressing the amount value to get the unique value when its multiple rows of same information
抱歉,标题混乱。
我在 Teradata 16.1 上,我有两个 table,一个是简单的 table,带有 id 和数量,另一个是详细的 table,带有子 id 和它们金额。在第二个 table 中,金额是构成 ID 数量的子 ID 的拆分。
加入这些 table 时,table 金额会重复(这很明显),但我只需要获得一次,以便我可以将该金额与其他金额进行核对 tables.Thinking 的两个解决方案(也向其他人开放)但不知道如何在 sql 中实现。全部在图片中。
有什么见解吗?
create volatile table main_table
(
id varchar(10), amount decimal(10,2) ) primary index (id) on commit preserve rows;
insert into main_table values ('A1',600); insert into main_table values ('A2',700); insert into main_table values ('A3',800);
create volatile table sub_table
(
id varchar(10), sub_id varchar(10), sub_value decimal(10,2) )
primary index (id,sub_id) on commit preserve rows;
insert into sub_table values ('A1','X1',300); insert into sub_table values ('A1','X2',300);
insert into sub_table values ('A2','Y1',700);
insert into sub_table values ('A3','Z1',200);insert into sub_table values ('A3','Z2',300);insert into sub_table values ('A3','Z3',300);
您可以从 sub_table 开始对行进行编号,以识别第一个并隐藏 main_table 其他人的数量
WITH
s as (
select ROW_NUMBER() over (partition by id order by subid) n, *
from sub_table
)
select m.id main_id, case when n = 1 then m.value else 0 end main_value, s.id sub_id, s.value
from main_table m
join s on m.id=s.id
结果
main_id main_value sub_id value
A1 600 A1 300
A1 0 A1 300
A2 700 A2 700
A3 800 A3 200
A3 0 A3 300
A3 0 A3 300
如果我没理解错的话,你可以只使用JOIN
和一些额外的逻辑:
select m.*, s.*,
(case when row_number() over (partition by m.id order by s.subid) = 1
then m.amount
else 0
end) as imputed_a_amount
from main_table m left join
sub_table s
on m.id = s.id;
或者:
select m.*, s.*,
m.amount / count(*) over (partition by m_id) as imputed_a_amount
from main_table m left join
sub_table s
on m.id = s.id;
抱歉,标题混乱。
我在 Teradata 16.1 上,我有两个 table,一个是简单的 table,带有 id 和数量,另一个是详细的 table,带有子 id 和它们金额。在第二个 table 中,金额是构成 ID 数量的子 ID 的拆分。
加入这些 table 时,table 金额会重复(这很明显),但我只需要获得一次,以便我可以将该金额与其他金额进行核对 tables.Thinking 的两个解决方案(也向其他人开放)但不知道如何在 sql 中实现。全部在图片中。
有什么见解吗?
create volatile table main_table
(
id varchar(10), amount decimal(10,2) ) primary index (id) on commit preserve rows;
insert into main_table values ('A1',600); insert into main_table values ('A2',700); insert into main_table values ('A3',800);
create volatile table sub_table
(
id varchar(10), sub_id varchar(10), sub_value decimal(10,2) )
primary index (id,sub_id) on commit preserve rows;
insert into sub_table values ('A1','X1',300); insert into sub_table values ('A1','X2',300);
insert into sub_table values ('A2','Y1',700);
insert into sub_table values ('A3','Z1',200);insert into sub_table values ('A3','Z2',300);insert into sub_table values ('A3','Z3',300);
您可以从 sub_table 开始对行进行编号,以识别第一个并隐藏 main_table 其他人的数量
WITH
s as (
select ROW_NUMBER() over (partition by id order by subid) n, *
from sub_table
)
select m.id main_id, case when n = 1 then m.value else 0 end main_value, s.id sub_id, s.value
from main_table m
join s on m.id=s.id
结果
main_id main_value sub_id value
A1 600 A1 300
A1 0 A1 300
A2 700 A2 700
A3 800 A3 200
A3 0 A3 300
A3 0 A3 300
如果我没理解错的话,你可以只使用JOIN
和一些额外的逻辑:
select m.*, s.*,
(case when row_number() over (partition by m.id order by s.subid) = 1
then m.amount
else 0
end) as imputed_a_amount
from main_table m left join
sub_table s
on m.id = s.id;
或者:
select m.*, s.*,
m.amount / count(*) over (partition by m_id) as imputed_a_amount
from main_table m left join
sub_table s
on m.id = s.id;