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 的解决方案更有效。