使用同一列中的先前值填充空值

时间:2018-04-23 06:44:09

标签: sql postgresql

Date            Name    Country  Channel    Joined_version    Expected_version
25/07/2018  Product 1   A            ios     1                1
25/07/2018  Product 1   B            ios     null             1
25/07/2018  Product 1   C            ios     null             1
25/07/2018  Product 1   D            play    2                2
25/07/2018  Product 2   A            play    1.1              1.1

26/07/2018  Product 2   A            ios     null             1.1
26/07/2018  Product 2   B            ios     null             1.1
26/07/2018  Product 2   C            ios     null             1.1
26/07/2018  Product 2   D            ios     null             1.1

26/07/2018  Product 1   E            ios     3                3

26/07/2018  Product 2   A            play    null             1.1

27/07/2018  Product 1   A            ios     null             3
27/07/2018  Product 1   B            ios     null             3
27/07/2018  Product 1   C            ios     null             3

在上表中,我已经从另一个具有日期和版本的表中加入了版本。 (例如:26日推出了ios产品1的新版本)

因此只有特定日期才有版本号。剩下的单元格将为Null。

我想用以前的版本名称填充空值,我将用它来聚合其他字段。

版本取决于日期,渠道和产品,取决于国家/地区。

我尝试了以下查询(来自stackoverflow)以及相同的各种排列。

    SELECT 
    t.*,
    FIRST_VALUE(joined_version) OVER (PARTITION BY val_part ORDER BY DATE, name, 
    channel) AS expected_version
    FROM 
    (
    SELECT 
    a.*,
    COUNT(joined_version) OVER (ORDER BY DATE order by date, name, channel) 
    AS val_part
    FROM table AS t ORDER BY date ASC
    )

我的输出有很多缺失值(对于expected_version),产品越多,缺失值越多。

请指出正确的方向,如有需要,我还会提供更多详情!

2 个答案:

答案 0 :(得分:1)

你已经标记了mysql和postgres。

在mysql中,您可以使用会话变量:

SELECT Date, Name, Channel, 
    CASE WHEN Joined_version IS NULL THEN
        @prev
    ELSE
        @prev := Joined_version
    END  AS Expected_version
FROM t1
order by Date, Name, Channel

答案 1 :(得分:0)

您可以这样做:

select t.*,
       coalese(joined_version,
               first_value(joined_version) over (partition by name order by (joined_version is not null)::int desc, date desc, name, channel)
              )
from t;

您可能需要检查namechannel是否按照您希望的方式处理。

这基本上实现了lag(ignore nulls),Postgres不支持。

Here是一个SQL小提琴。