我正在使用impalasql。我目前有一个包含3列的数据库: Account
, Date
, Type
.
低于 Type
有各种数据字符串描述关联的类型,但有些字符串等于 'UNKNOWN'
有些是 null
.
我想再创建一个专栏 Fixed_Type
. 中的值 Fixed_Type
应该来自 Type
列。
如果 Type
或者 null
或者 'UNKNOWN'
,它应该获取 Type
列,按帐户分区并按日期排序。
如果分区以 null
或者 'UNKNOWN'
,则 Fixed_Type
应为中的第一个有效值 Type
.
例如:
Account | Date | Type | Fixed_Type
1 Jan data1 data1
1 Feb 'UNKNOWN' data1
1 Mar null data1
2 Apr data2 data2
2 May null data2
2 Jun null data2
2 Jul data3 data3
3 Feb 'UNKNOWN' data4
3 Mar 'UNKNOWN' data4
3 Apr data4 data4
我开始在oracle中这样做,但后来意识到没有类似的功能 IGNORE NULLS
在 Impala 实施。
这就是我在oracle中的想法(我意识到这只处理空值的前向填充):
select account, date, type,
case when type is null
then last_value(type ignore nulls)
over (partition by account order by date)
else type
end as fixed_type
3条答案
按热度按时间3j86kqsm1#
我使用postgresql来测试查询,所以不能100%确定是否可以在您的系统中工作。
WITH
可以替换为子查询。还得把日期改成数字ORDER BY
按计划工作。枚举词:为有效词创建枚举列表。
createflag:设置一个标志,以便验证下一个组何时启动。
creategrp:使用标志和
SUM()
创建组。最后,使用枚举列表加入组以分配
Fixed_Type
连接中的特殊条件c.grp = 0 and e.rn =1
当第一排是NULL
或者'UNKNOWN'
sql fiddle演示输出
如您所见,creategrp显示
Fixed_Type
从db上的值中键入,但enumeratewords从Type
.您可以看到flag和grp如何协同工作来检测更改。
o4hqfura2#
oracle设置:
查询:
说明:
如果将表与自身联接,使两个表具有相同的帐号,则可以将每个帐户的每一行与同一帐户中的所有其他行进行比较。但是,我们对比较所有的行不感兴趣,只对不比较的行感兴趣
NULL
或者'UNKNOWN'
所以我们得到了连接条件:一
LEFT OUTER JOIN
仅当有一个帐户号码NULL
或者'UNKNOWN'
值,以便不排除行。然后就是找到最近的那一行。在oracle中,如果将一个日期与另一个日期相减,则得到天数(或天数的分数)之差-因此:
SIGN( ABS( t.dt - r.dt ) )
将给予0
如果两个日期相同或1
如果他们是不同的。首先排序意味着如果有一个值具有相同的日期,那么它将优先于不相同的日期;SIGN( t.dt - r.dt )
会回来的0
如果两个日期相同(但已在上一条语句中进行了筛选),或者-1
如果比较日期早于当前行或+1
如果是在之后-这是用来选择之前的日期,而不是之后的日期。ABS( t.dt - r.dt )
将按最接近的日期排序。所以
ORDER BY
条款有效地规定:ORDER BY
先是相同的日期,然后是之前的日期(最接近r.dt
首先)最后日期(最接近r.dt
首先)。然后,所有这些都放在一个内联视图中,并进行过滤,以获得每一行的最佳匹配(
WHERE rn = 1
).输出:
rn0zuynd3#
这是一个解决方案,类似于胡安卡洛斯的,使用解析函数
count
和一个case
表达式一次创建组。我创建了更多的输入数据来测试,例如,当一个帐户只有
null
和/或'UNKNOWN'
as type(确保左外连接按预期工作)。查询:
输出: