我想知道如何将逗号分隔的值转换为Redshift中的行.我担心我自己的解决方案不是最优的.请指教.我有一个表与其中一个具有逗号分隔值的列.例如:
我有:
user_id|user_name|user_action
-----------------------------
1 | Shone | start,stop,cancell...
Run Code Online (Sandbox Code Playgroud)
我想看看
user_id|user_name|parsed_action
-------------------------------
1 | Shone | start
1 | Shone | stop
1 | Shone | cancell
....
Run Code Online (Sandbox Code Playgroud) 我试过以下:
SELECT * FROM generate_series(2,4);
generate_series
-----------------
2
3
4
(3 rows)
SELECT * FROM generate_series(5,1,-2);
generate_series
-----------------
5
3
1
(3 rows)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试时,
select * from generate_series('2011-12-31'::timestamp, '2012-12-31'::timestamp, '1 day');
Run Code Online (Sandbox Code Playgroud)
它产生了错误.
Run Code Online (Sandbox Code Playgroud)ERROR: function generate_series(timestamp without time zone, timestamp without time zone, "unknown") does not exist HINT: No function matches the given name and argument types. You may need to add explicit type casts.
我在Redshift 1.0.757上使用PostgreSQL 8.0.2.
知道为什么会这样吗?
更新:
generate_series现在正在使用Redshift.
SELECT CURRENT_DATE::TIMESTAMP - (i * interval '1 day') as date_datetime …Run Code Online (Sandbox Code Playgroud) 当我运行SQL查询时:
select generate_series(0,g)
from ( select date(date1) - date(date2) as g from mytable ;
Run Code Online (Sandbox Code Playgroud)
它返回一个错误:
INFO: Function "generate_series(integer,integer)" not supported.
ERROR: Specified types or functions (one per INFO message) not supported
on Redshift tables.
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个查询时:
select generate_series(0, g) from (select 5 as g)
Run Code Online (Sandbox Code Playgroud)
它返回以下响应:
generate_series
-----------------
0
1
2
3
4
5
(6 rows)
Run Code Online (Sandbox Code Playgroud)
为什么第二个查询有效,而第一个查询失败?
我认为这可能是一个常见的问题,可能无法解决每个工具.现在我们正在尝试使用amazons Redshift.我们现在唯一的问题是我们正在尝试查找IP地址的邮政编码.我们将IP连接到城市的表是IP转换为整数的范围.
例:
Start IP | End IP | City
| 123123 | 123129 | Rancho Cucamonga|
Run Code Online (Sandbox Code Playgroud)
我在intip> = startip和intip <endip上尝试了明显的内连接.
有谁知道这样做的好方法?
我需要为报告创建一个空的时间表系列,这样我就可以将几个表的连接活动留给它了.一天中的每个小时都不一定有数据,但我希望它显示为零或零以获取不活动而不是省略当天的那个小时.
在后期版本的Postgres(后8.0.2版)中,这在以下几个方面很容易:
SELECT unnest(array[0,1,2,3,4...]) as numbers
要么
CROSS JOIN (select generate_series as hours
from generate_series(now()::timestamp,
now()::timestamp + interval '1 day',
'1 hour'::interval
)) date_series
Redshift可以运行其中一些命令,但是当您尝试与任何表一起运行它时会引发错误.
我需要的:
生成一系列数字(例如0-23)作为将在redshift上运行的子查询的可靠方法(使用postgres 8.0.2).