SQL 查询 - 填充缺失值
SQL query - fill missing value
我有一个 table:
id type place
1 X1 10
2 X2 10
3 X3 10
1 X1 50
2 X2 50
3 X3 50
1 null 70
2 null 70
3 null 70
我有三个 id 为 (1,2,3) 的部分,这些部分在不同的地方属于任何类型。但是,在那个地方,“70”还没有写字。
但是,作为计件的一部分,我需要对给定类型(例如 X5)的位置 70 进行计数。但是到位70的没有列出来。如何在子查询中的 selection 中添加此数据?例如,我采用这些 ID 并以某种方式引用这些 ID 的类型为 X5?
我要:
SQL 查询 select 位置 70 的所有列,并为给定 ID 添加类型。
我尝试了这个 sql 查询,但它是错误的:
SELECT id, type, place
FROM TABLE t1
WHERE type = (
SELECT type
FROM TABLE t2
WHERE t1.id = t2.id
AND place = 10
)
AND place = 70
我找到了您问题的部分答案 here:
SELECT id,
CASE WHEN type is null
then (
SELECT type
FROM T as t2
WHERE t1.id is t2.id and t2.type is not null)
else type
end as type,
place
FROM T as t1
我的演示(我做的here):
id type place
1 X1 10
2 X2 10
3 null 70
2 null 70
1 null 70
3 X3 50
3 X3 50
2 X2 50
1 X1 50
1 X1 50
1 X1 50
3 X3 10
returns
id type place
1 X1 10
2 X2 10
3 X3 70
2 X2 70
1 X1 70
3 X3 50
3 X3 50
2 X2 50
1 X1 50
1 X1 50
1 X1 50
3 X3 10
MySQL解法(demo):
SELECT id,
CASE WHEN type is null
then (
SELECT type
FROM T as t2
WHERE (t1.id = t2.id) and (t2.type is not null) LIMIT 1)
else type
end as type,
place
FROM T as t1
我会强烈推荐window功能。例如:
select t.*,
max(type) over (partition by id) as imputed_typ
from t;
要“填写”现有值:
select id, place,
coalesce(type, max(type) over (partition by id)) as type
from t;
这些查询不仅比子查询简单得多,而且它们应该具有更好的性能。
我有一个 table:
id type place
1 X1 10
2 X2 10
3 X3 10
1 X1 50
2 X2 50
3 X3 50
1 null 70
2 null 70
3 null 70
我有三个 id 为 (1,2,3) 的部分,这些部分在不同的地方属于任何类型。但是,在那个地方,“70”还没有写字。 但是,作为计件的一部分,我需要对给定类型(例如 X5)的位置 70 进行计数。但是到位70的没有列出来。如何在子查询中的 selection 中添加此数据?例如,我采用这些 ID 并以某种方式引用这些 ID 的类型为 X5?
我要:
SQL 查询 select 位置 70 的所有列,并为给定 ID 添加类型。
我尝试了这个 sql 查询,但它是错误的:
SELECT id, type, place
FROM TABLE t1
WHERE type = (
SELECT type
FROM TABLE t2
WHERE t1.id = t2.id
AND place = 10
)
AND place = 70
我找到了您问题的部分答案 here:
SELECT id,
CASE WHEN type is null
then (
SELECT type
FROM T as t2
WHERE t1.id is t2.id and t2.type is not null)
else type
end as type,
place
FROM T as t1
我的演示(我做的here):
id type place
1 X1 10
2 X2 10
3 null 70
2 null 70
1 null 70
3 X3 50
3 X3 50
2 X2 50
1 X1 50
1 X1 50
1 X1 50
3 X3 10
returns
id type place
1 X1 10
2 X2 10
3 X3 70
2 X2 70
1 X1 70
3 X3 50
3 X3 50
2 X2 50
1 X1 50
1 X1 50
1 X1 50
3 X3 10
MySQL解法(demo):
SELECT id,
CASE WHEN type is null
then (
SELECT type
FROM T as t2
WHERE (t1.id = t2.id) and (t2.type is not null) LIMIT 1)
else type
end as type,
place
FROM T as t1
我会强烈推荐window功能。例如:
select t.*,
max(type) over (partition by id) as imputed_typ
from t;
要“填写”现有值:
select id, place,
coalesce(type, max(type) over (partition by id)) as type
from t;
这些查询不仅比子查询简单得多,而且它们应该具有更好的性能。