我正在尝试使用同一表中另一行的值更新表上的多个列:
CREATE TEMP TABLE person (
pid INT
, name VARCHAR(40)
, dob DATE
, younger_sibling_name VARCHAR(40)
, younger_sibling_dob DATE
);
INSERT INTO person VALUES (pid, name, dob)
(1, 'John' , '1980-01-05')
, (2, 'Jimmy', '1975-04-25')
, (3, 'Sarah', '2004-02-10')
, (4, 'Frank', '1934-12-12')
;
任务是填充年龄最接近他们的人的姓名和生日,但不是年龄更大或年龄相同younger_sibling_name
。younger_sibling_dob
我可以dob
轻松设置年幼的兄弟姐妹,因为这是确定要与相关子查询一起使用的记录的值(我认为这是一个例子?):
UPDATE person SET younger_sibling_dob = (
SELECT MAX(dob)
FROM person AS sibling
WHERE sibling.dob < person.dob);
我只是看不到任何方法来获得name
?
对于每个 MAX 选择,真正的查询将在 100-500 组中运行大约1M 行,因此性能是一个问题。
编辑
在尝试了许多不同的方法之后,我决定采用这种方法,我认为这是一种很好的平衡,能够用中间结果验证数据,显示逻辑的意图,并充分执行:
WITH sibling AS (
SELECT person.pid, sibling.dob, sibling.name,
row_number() OVER (PARTITION BY person.pid
ORDER BY sibling.dob DESC) AS age_closeness
FROM person
JOIN person AS sibling ON sibling.dob < person.dob
)
UPDATE person
SET younger_sibling_name = sibling.name
,younger_sibling_dob = sibling.dob
FROM sibling
WHERE person.pid = sibling.pid
AND sibling.age_closeness = 1;
SELECT * FROM person ORDER BY dob;