SQL - 如何从多个表中为每个 ID 的每个列选择最佳可用值?
SQL - How to pick the best available value for each column for each ID from multiple tables?
我有两个 table 具有相同的变量,指的是一个人的属性。
我如何合并来自两个这样的 table 的数据,从每个字段的每个 table 中为每个列选择最佳可用值?
要求:
- 对于每个字段,我想用 table 之一的值填充它,优先选择 table 1.
- table
中的值可以为 NULL
- 在组合 table 中,第 1 列的值可能来自 table 2(如果 table 1 缺少那个人的值)和第 1 列的值2 可以来自 table 1(因为两个 table 都有一个值,但是来自 table 1 的值是首选)。
- 在我的真实示例中,我有很多列,因此首选代码重复较少的优雅解决方案。
- 有些用户可能只存在于 table 个中。
示例:
Table 1:
user_id | age | income
1 | NULL| 58000
2 | 22 | 60000
4 | 19 | 35000
Table 2:
user_id | age | income
1 | 55 | 55000
2 | 19 | NULL
3 | 22 | 33200
期望的输出:
user_id | age | income
1 | 55 | 58000
2 | 22 | 60000
3 | 22 | 33200
4 | 19 | 35000
尝试像下面这样使用 coalesce()
select t1.user_id, coalesce(t1.age,t2.age),
t1.income>t2.income then t1.income else t2.income end as income
table1 t1 join table2 t2 on t1.usesr_id=t2.user_id
如果每个 table 中的 user_id 是唯一的,则使用完全外部联接。
SELECT
COALESCE(t1.user_id, t2.user_id) AS user_id,
GREATEST(t1.age, t2.age) AS age,
GREATEST(t1.income, t2.income) AS income
FROM t1
FULL OUTER JOIN t2 ON t1.user_id = t2.user_id
我认为这是 full join
和 colaesce()
的优先逻辑:
select user_id,
coalesce(t1.age, t2.age) as age,
coalesce(t1.income, t2.income) as income
from table1 t1
full join table2 t2 using(user_id)
You can use below code:
With TableA(Id,age,income) as
( --Select Common Data
select table_1.id,
--Select MAX AGE
case
when table_1.age> table_2.age or table_2.age is null then table_1.age else table_2.age
end,
--Select MAX Income
case
when table_1.income>table_2.income or table_2.income is null then table_1.income else table_2.income
end
from table_1 inner join table_2 on table_2.id=table_1.id
union all
-- Select Specific Data of Table 2
select table_2.id,table_2.age,table_2.income
from table_2
where table_2.id not in (select table_1.id from table_1)
union all
-- Select Specific Data of Table 1
select table_1.id,table_1.age,table_1.income
from table_1
where table_1.id not in (select table_2.id from table_2)
)select * from TableA
我有两个 table 具有相同的变量,指的是一个人的属性。
我如何合并来自两个这样的 table 的数据,从每个字段的每个 table 中为每个列选择最佳可用值?
要求:
- 对于每个字段,我想用 table 之一的值填充它,优先选择 table 1.
- table 中的值可以为 NULL
- 在组合 table 中,第 1 列的值可能来自 table 2(如果 table 1 缺少那个人的值)和第 1 列的值2 可以来自 table 1(因为两个 table 都有一个值,但是来自 table 1 的值是首选)。
- 在我的真实示例中,我有很多列,因此首选代码重复较少的优雅解决方案。
- 有些用户可能只存在于 table 个中。
示例:
Table 1:
user_id | age | income
1 | NULL| 58000
2 | 22 | 60000
4 | 19 | 35000
Table 2:
user_id | age | income
1 | 55 | 55000
2 | 19 | NULL
3 | 22 | 33200
期望的输出:
user_id | age | income
1 | 55 | 58000
2 | 22 | 60000
3 | 22 | 33200
4 | 19 | 35000
尝试像下面这样使用 coalesce()
select t1.user_id, coalesce(t1.age,t2.age),
t1.income>t2.income then t1.income else t2.income end as income
table1 t1 join table2 t2 on t1.usesr_id=t2.user_id
如果每个 table 中的 user_id 是唯一的,则使用完全外部联接。
SELECT
COALESCE(t1.user_id, t2.user_id) AS user_id,
GREATEST(t1.age, t2.age) AS age,
GREATEST(t1.income, t2.income) AS income
FROM t1
FULL OUTER JOIN t2 ON t1.user_id = t2.user_id
我认为这是 full join
和 colaesce()
的优先逻辑:
select user_id,
coalesce(t1.age, t2.age) as age,
coalesce(t1.income, t2.income) as income
from table1 t1
full join table2 t2 using(user_id)
You can use below code:
With TableA(Id,age,income) as
( --Select Common Data
select table_1.id,
--Select MAX AGE
case
when table_1.age> table_2.age or table_2.age is null then table_1.age else table_2.age
end,
--Select MAX Income
case
when table_1.income>table_2.income or table_2.income is null then table_1.income else table_2.income
end
from table_1 inner join table_2 on table_2.id=table_1.id
union all
-- Select Specific Data of Table 2
select table_2.id,table_2.age,table_2.income
from table_2
where table_2.id not in (select table_1.id from table_1)
union all
-- Select Specific Data of Table 1
select table_1.id,table_1.age,table_1.income
from table_1
where table_1.id not in (select table_2.id from table_2)
)select * from TableA