SQL LEFT_JOIN table 在替换列时对自身
SQL LEFT_JOIN table on itself while replacing column
我有以下数据:
value1 value2 value3
qwe bird 1
qwe 2
qwe 3
asd dog 4
asd 5
我想要以下数据:
value1 value2 value3
qwe bird 1
qwe bird 2
qwe bird 3
asd dog 4
asd dog 5
对我来说,这个问题似乎可以通过左连接 table 的两列本身来解决,同时替换一列。类似于:
# Selecting unique value1 and value2 combinations
SELECT value1, value2
FROM mytable
WHERE value2 != ''
GROUP BY value1, value2
# Left joining two tables
SELECT value1, value2
FROM selection_table
LEFT JOIN mytable
ON selection_table.value1 = mytable.value1;
我能否以某种方式在一次调用中完成整个操作,从而避免必须进行中间 tables?进行左联接时,我可以覆盖 value2 列吗?
或者你有更聪明的方法来做到这一点?我相信一定有一个:)
在标准 SQL 中,您可以使用 lag(ignore nulls)
:
select t.*, lag(value2 ignore nulls) over (partition by value1 order by value3)
from t;
但是,许多数据库没有实现此功能。一种方法是两级聚合,一种是获取具有值的value3
,第二种是传播值:
select t.*,
max(value2) over (partition by value1, grp)
from (select t.*,
max(case when value2 is not null then value3 end) over (partition by value1 order by value3) as grp
from t
) t
一个简单的解决方案应用Windowed Aggregate
SELECT value1
,max(value2) -- group maximum
over (partition by value1)
,value3
from mytable
这通常比基于 self-join 的解决方案更有效。
我有以下数据:
value1 value2 value3
qwe bird 1
qwe 2
qwe 3
asd dog 4
asd 5
我想要以下数据:
value1 value2 value3
qwe bird 1
qwe bird 2
qwe bird 3
asd dog 4
asd dog 5
对我来说,这个问题似乎可以通过左连接 table 的两列本身来解决,同时替换一列。类似于:
# Selecting unique value1 and value2 combinations
SELECT value1, value2
FROM mytable
WHERE value2 != ''
GROUP BY value1, value2
# Left joining two tables
SELECT value1, value2
FROM selection_table
LEFT JOIN mytable
ON selection_table.value1 = mytable.value1;
我能否以某种方式在一次调用中完成整个操作,从而避免必须进行中间 tables?进行左联接时,我可以覆盖 value2 列吗?
或者你有更聪明的方法来做到这一点?我相信一定有一个:)
在标准 SQL 中,您可以使用 lag(ignore nulls)
:
select t.*, lag(value2 ignore nulls) over (partition by value1 order by value3)
from t;
但是,许多数据库没有实现此功能。一种方法是两级聚合,一种是获取具有值的value3
,第二种是传播值:
select t.*,
max(value2) over (partition by value1, grp)
from (select t.*,
max(case when value2 is not null then value3 end) over (partition by value1 order by value3) as grp
from t
) t
一个简单的解决方案应用Windowed Aggregate
SELECT value1
,max(value2) -- group maximum
over (partition by value1)
,value3
from mytable
这通常比基于 self-join 的解决方案更有效。