sql - 如何使用数值在 SQL 中将长格式转换为宽格式
问题描述
我有一个看起来像这样的数据集
doc date value
2345 201902 470942
2345 201903 470044
2345 201904 470
2345 201905 35000 ...
我想像这样转变
doc date value value_1m value_2m value_3m
2345 201905 35000 470 470044 470942
2345 201904 470 470044 470942 ...
如您所见,新列 value_1m、value_2m、value_3m 是前几个月的值 201904、201903、201902 等。
我已经尝试使用(CASE WHEN key),但我的变量“日期”是一个数字,每个月都会使用,所以我不能使用它。
我是这个论坛的新手,所以如果不太清楚,请见谅,并在此先感谢。
解决方案
在 Impala 上,你可以尝试这样的事情
你的数据表
+---------------------+-----------------------+-----------------------+--+
| doc_date_value.doc | doc_date_value.cdate | doc_date_value.value |
+---------------------+-----------------------+-----------------------+--+
| 2345 | 201902 | 470942 |
| 2345 | 201903 | 470044 |
| 2345 | 201904 | 470 |
| 2345 | 201905 | 35000 |
+---------------------+-----------------------+-----------------------+--+
带窗口函数的查询和多个子查询
WITH t2 AS(
WITH t AS(
SELECT *, LEAD(value,1,0) OVER(PARTITION BY doc ORDER BY cdate DESC) as value_1m
FROM doc_date_value
ORDER BY cdate DESC)
SELECT doc, cdate,value, value_1m,
LEAD(value_1m,1,0) OVER(PARTITION BY doc ORDER BY cdate DESC) as value_2m
FROM t)
SELECT doc, cdate,value, value_1m, value_2m,
LEAD(value_2m,1,0) OVER(PARTITION BY doc ORDER BY cdate DESC) as value_3m
FROM t2;
预期产出
+------+--------+--------+----------+----------+----------+
| doc | cdate | value | value_1m | value_2m | value_3m |
+------+--------+--------+----------+----------+----------+
| 2345 | 201905 | 35000 | 470 | 470044 | 470942 |
| 2345 | 201904 | 470 | 470044 | 470942 | 0 |
| 2345 | 201903 | 470044 | 470942 | 0 | 0 |
| 2345 | 201902 | 470942 | 0 | 0 | 0 |
+------+--------+--------+----------+----------+----------+
您可以在 Impala 或 Hive 上运行此查询。
推荐阅读
- c# - 带有 firebase 用户注册错误的 Xamarin 表单
- c++ - 访问模板类对象向量中的对象
- projection - OpenJSCAD:找不到用于 3D 到 2D 投影的命令
- mysql - mysql命令行中的制表符完成
- javascript - 为什么承诺同时执行而不是按顺序执行?
- node.js - 如何使用 Strapi 存储用户数据
- google-analytics - 谷歌分析测量协议命中出现在实时但不在行为部分
- hazelcast - Hazelcast jet 中的堆内存已满
- html - 当我将按钮的宽度和高度更改为小数字时,按钮中的内联图标不居中
- postgresql - Google Cloud SQL - 导出 API - PostgreSQL:错误 400 请求的操作对只读副本实例无效