如何使用数值将 SQL 中的长格式转换为宽格式
How to transform long to wide format in SQL with numeric values
我有一个看起来像这样的数据集
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 键)但是我的变量 "date" 是一个数字并且每个月都会出现所以我不能使用它。
我是这个论坛的新手,所以如果不是太清楚请见谅,在此先感谢。
超过 Impala 你可以尝试这样的事情
你的数据table
+---------------------+-----------------------+-----------------------+--+
| 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 进行此查询。
我有一个看起来像这样的数据集
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 键)但是我的变量 "date" 是一个数字并且每个月都会出现所以我不能使用它。
我是这个论坛的新手,所以如果不是太清楚请见谅,在此先感谢。
超过 Impala 你可以尝试这样的事情
你的数据table
+---------------------+-----------------------+-----------------------+--+
| 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 进行此查询。