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;

这些查询不仅比子查询简单得多,而且它们应该具有更好的性能。