sql - 在 Hive SQL 中选择上一个值
问题描述
我一直在戳这个一段时间,但没有运气。我有一张像下面这样的桌子。我试图在每个用户的第一个文本值之前获取 col 值。我在蜂巢。
user ts col isnumber
1 1473811200 5 y
1 1473811205 10 y
1 1473811207 15 y
1 1473811212 text1 n
1 1473811215 text2 n
1 1473811225 30 y
2 1473811201 10 y
2 1473811205 text3 n
2 1473811207 20 y
2 1473811210 30 y
输出应该是:
user col
1 15
2 10
解决方案
使用窗口函数:
SELECT user_, prev
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY user_ ORDER BY ts) AS rn
FROM (SELECT *, CASE
WHEN isnumber = 'y' THEN NULL
WHEN LAG(isnumber,1) OVER(PARTITION BY user_ ORDER BY ts) = 'y'
THEN LAG(col,1) OVER(PARTITION BY user_ ORDER BY ts)
END AS prev
FROM tab) sub
WHERE prev IS NOT NULL) sub2
WHERE rn = 1;
推荐阅读
- javascript - 为什么当我编写 array.map、foreach 或简单的 for 时,它在 Electron + Javascript 中异步运行?
- sql - 为聚合列添加小计列
- python-3.x - 可以在请求时从文件中“输出”新行的数据类
- r - 如何更改ggplot中条形图的颜色保持图例变量相同?
- c# - Time.Timescale 没有暂停游戏
- python - 尝试使用 matplotlib 打开 .img 文件
- python - Numba 慢速数组元素分配给变量
- virtualization - 带有 qemu 的 libvirtd:英特尔主机上的 ryzen cpu 仿真?
- rspec - 每次打开带有 gem 文件的项目时,我是否必须进行捆绑安装?
- java - Json 到 Spring 表达式映射异常