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),产品越多,缺失值越多。
请指出正确的方向,如有需要,我还会提供更多详情!
答案 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;
您可能需要检查name
和channel
是否按照您希望的方式处理。
这基本上实现了lag(ignore nulls)
,Postgres不支持。
Here是一个SQL小提琴。