sql - 获取之前的非空值
问题描述
我有一张 t0 费率表
例子 :
id code dev period rate
4937 TRY EUR 201812 0.1649
4940 AED EUR 201812 0.2392
4857 USD EUR 201812 1.4259
4845 CNY EUR 201811 0.1678
4851 AED EUR 201811 0.3949
4960 AED EUR 201810 1.1949
4886 TRY EUR 201809 1.128
4986 RSD EUR 201808 1.006
我想从表 t1 中获取每个日期的 t0 速率
我尝试了 last_value 函数,但它不起作用。你有另一个想法吗?
select t3.id
,t0.period
,t1.date
,t0.code
,(CASE WHEN t0.period is null THEN last_value(t0.rate ignore nulls) OVER (order by t1.date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) ELSE t0.rate END) as rate
from t1
INNER JOIN t2 ON t2.id = t1.id
LEFT OUTER JOIN t3 ON t3.id = t1.id3
LEFT OUTER JOIN t0 ON t0.code = t1.code
AND t0.period < to_char(t1.date, 'YYYYMM')
期望的结果:
案例 0:
如果 t0.period = to_char(t1.date, 'YYYYMM') ,所以我想要一行
15|201812|201812|TRY|0.1649
21|201808|201808|RSD|1.006
情况1 :
如果 t0.period 为空,那么我搜索最后一个不为空的利率:
2|201812|201911|AED|0.2392
45|201812|201910|USD|1.4259
解决方案
您还可以使用内部连接和分析功能来实现这一点 - 例如:
WITH t0 AS (SELECT 4937 ID, 'TRY' CODE, 'EUR' dev, 201812 period, 0.1649 rate FROM dual UNION ALL
SELECT 4940 ID, 'AED' CODE, 'EUR' dev, 201812 period, 0.2392 rate FROM dual UNION ALL
SELECT 4857 ID, 'USD' CODE, 'EUR' dev, 201812 period, 1.4259 rate FROM dual UNION ALL
SELECT 4845 ID, 'CNY' CODE, 'EUR' dev, 201811 period, 0.1678 rate FROM dual UNION ALL
SELECT 4851 ID, 'AED' CODE, 'EUR' dev, 201811 period, 0.3949 rate FROM dual UNION ALL
SELECT 4960 ID, 'AED' CODE, 'EUR' dev, 201810 period, 1.1949 rate FROM dual UNION ALL
SELECT 4886 ID, 'TRY' CODE, 'EUR' dev, 201809 period, 1.128 rate FROM dual UNION ALL
SELECT 4986 ID, 'RSD' CODE, 'EUR' dev, 201808 period, 1.006 rate FROM dual),
t1 AS (SELECT 15 ID, 201812 dt, 'TRY' CODE FROM dual UNION ALL
SELECT 21 ID, 201808 dt, 'RSD' CODE FROM dual UNION ALL
SELECT 2 ID, 201911 dt, 'AED' CODE FROM dual UNION ALL
SELECT 45 ID, 201910 dt, 'USD' CODE FROM dual)
SELECT ID,
period,
dt,
CODE,
rate
FROM (
SELECT t1.id,
t0.period,
t1.dt,
t1.code,
t0.rate,
MAX(t0.period) OVER (PARTITION BY t1.id) max_period-- assuming t1.id is the primary or unique key for t1
FROM t0
INNER JOIN t1 ON t0.period <= t1.dt AND t0.code = t1.code)
WHERE period = max_period;
ID PERIOD DT CODE RATE
---------- ---------- ---------- ---- ----------
2 201812 201911 AED 0.2392
15 201812 201812 TRY 0.1649
21 201808 201808 RSD 1.006
45 201812 201910 USD 1.4259
如果我是你,我会检查哪个答案对你的数据和结构等最有效。
推荐阅读
- matlab - MATLAB 降低图像质量
- c++ - 如何连接整数和 wstring 并将它们放入静态 char 数组
- c# - 尝试将标签从 IIS 打印到打印机但没有运气
- css - 如何使用 Styled-Components 设置全局字体系列
- solr - 如何为 solr cloud 中的每个集合使用单核?
- python - 在 Debian OS 上使用 pandas 从 github 存储库中读取 csv 文件时出现奇怪的 csv 输出
- python - 芹菜警告“收到并删除未知消息”
- iframe - 使用 iframe 的 webgl 太多
- neo4j - 如何在密码中的关系名称中使用通配符
- php - 如何在自定义帖子查询中添加数字分页?