【发布时间】:2019-06-19 08:32:10
【问题描述】:
我正在使用 sql 的“first_value”函数使用查询来填充空值 整个查询示例如下:
WITH example (date,close) AS
(VALUES
('12:00:00',3),
('12:00:01',4),
('12:00:01',5),
('12:00:03',NULL),
('12:00:04',NULL),
('12:00:05',3)
)
SELECT * INTO temporary table market_summary FROM example;
select
date,
cccc,
first_value(cccc) over (partition by grp_close) as corrected_close
from (
select date, close as cccc,
sum(case when close is not null then 1 end) over (order by date) as grp_close
from market_summary
) t
结果是:
date cccc corrected_close
1 12:00:00 3 3
2 12:00:01 4 4
3 12:00:01 5 4
4 12:00:03 NULL 4
5 12:00:04 NULL 4
6 12:00:05 3 3
在此示例中,“日期”用作查询中的 order_by 列,但它与“12:00:01”重复。空值用'4'填充,理想情况下是不正确的,因为我希望用以前的非空值填充空值,在这种情况下是'5'而不是'4',因此结果应该如下:
date cccc corrected_close
1 12:00:00 3 3
2 12:00:01 4 4
3 12:00:01 5 5
4 12:00:03 NULL 5
5 12:00:04 NULL 5
6 12:00:05 3 3
如何修改查询以满足我的要求?
【问题讨论】:
-
您使用的是 MySQL、Oracle 还是 Postgresql?
-
“当 order_by 列具有重复值时 order_by 在 sql 中的行为如何?” ANSI/ISO 标准 SQL 被定义为返回非唯一列的非确定性(随机)结果重复值的值。要始终获得 100% 确定性(固定),您还至少向 ORDER BY 子句添加一列,其中包含主键或唯一键。
-
对于示例数据
1 | 12:00:00, 2 | 12:00:01, 3 | 12:00:01和ORDER BY date的含义,您不知道哪个记录将是第一个或最后一个,12:00:01值这些记录的结果顺序是不确定的(随机) , 要获得非确定性(随机)结果,您必须使用ORDER BY date, id假设 id 是主键。 -
你需要使用
first_value(cccc) over (partition by grp_close order by date, cccc) as corrected_close-- 增加了Order by子句 -
for @jarlh im 使用 postgres
标签: sql postgresql sql-order-by