我想在Posterre中执行向下填充操作。
DDL:
create table brands (
id int,
category varchar(20),
brand_name varchar(20)
);
insert into brands values
(1,'chocolates','5-star')
,(2,null,'dairy milk')
,(3,null,'perk')
,(4,null,'eclair')
,(5,'Biscuits','britannia')
,(6,null,'good day')
,(7,null,'boost')
,(8,'shampoo','h&s')
,(9,null,'dove')
;
字符串
预期输出为:
| 类别|品牌名称|
| --|--|
| 巧克力|5星星|
| 巧克力|dairy milk|
| 巧克力|perk|
| 巧克力|Eclair|
| 饼干|Britannia|
| 饼干|好日子|
| 饼干|提振|
| 洗发水|H&S|
| 洗发水|鸽子|
我尝试使用以下脚本,但似乎不起作用。
select id,
first_value(category)
over(order by case when category is not null then id end desc nulls last) as category,
brand_name
from brands
型
有人能给我个建议吗?
在MS SQL中,以下代码段似乎可以正常工作:
select id,
first_value (category) IGNORE NULLS
over(order by id desc
rows between current row and unbounded following) as category,
brand_name
FROM brands
ORDER BY id
型
4条答案
按热度按时间vof42yt11#
字符串
更新:根据请求添加了无CTE的查询:
型
xcitsw882#
我认为使用
CTE
没有什么错(见JHH的回答),我更喜欢这样。Postgres数据库不提供SQLServer数据库的
IGNORE NULLS
概念,所以我想你应该停止认为你会得到一个几乎像MS SQL一样的Postgres数据库查询。无论如何,如果你不想使用CTE或复杂的子查询,你可以定义自己的函数和聚合并运行它。
功能创建:
字符串
使用以下函数创建聚合:
型
使用此聚合的查询:
型
当然,您应该重命名函数和聚合,并使用更有意义的名称。
这将产生与CTE版本相同的结果。
试用:db<>fiddle
如果你热衷于定义和使用自己的函数,并且你会经常使用它,你可以这样做。
否则,就用CTE,那很好。没有理由不用CTE的。
请始终注意,在使用自己的函数时,您有性能不佳的风险,因此您应该检查此查询是否太慢。
uyto3xhc3#
恐怕这在Postgres中没有实现(至少在Postgres 15之前)。manual about window functions:
SQL标准为
lead
、lag
、first_value
、last_value
和nth_value
定义了RESPECT NULLS
或IGNORE NULLS
选项。这在PostgreSQL中没有实现:行为总是与标准的默认值相同,即RESPECT NULLS
。因此,您必须使用JHH建议的CTE或子查询的解决方案,或者滚动自己的窗口函数(这将相对较慢)。
参见(dba.SE上类似问题的答案):
ghhkc1vu4#
字符串