2014-03-25 42 views

回答

4

目前没有序列的概念(如Oracle中所见)。

您有几种选择:在整套

  • 号码表
  • RANK()或ROW_NUMBER()的窗函数。请注意,如果您拥有多节点群集,则可能会产生一些负面的性能影响。
  • 定义为IDENTITY(seed,step)的列。请注意,IDENTITY序列可能是'稀疏'(例如,序列中有空位)。
+0

我们有多节点红移群集。身份 - 预计会提供独特的价值而不会发生碰撞? – user3279189

+2

是的,IDENTITY值不会相互碰撞,但它们不保证是连续的,例如,对于8节点群集,您将获得1,9,17,25个值的运行。 –

+0

谢谢..我知道了... – user3279189

1

我是Redshift的新手,我发现本文寻找一个常见的序列,这在Amazon数据库中不受支持。我发现这个解决方案我会用一个完整的例子报告,使用ROW_NUMBER

我有模式sta and dim。在sta我有临时表,而在昏暗我有维度表我想用ID填充。我有一个信息来源,其中包含字段trk_key名称包含例如一些发布者。

CREATE TABLE sta.publisher (
     trk_key VARCHAR(20), 
     name VARCHAR(225) 
); 
CREATE TABLE dim.publisher (
     id SMALLINT, 
     trk_key VARCHAR(20), 
     name VARCHAR(255), 
     PRIMARY KEY (id) 
); 

首先我截断sta.publisher表并加载有一个CSV文件。然后我启动下面的查询

-- This query is idempotent: 
-- it will insert a publisher found in sta.publisher table only if 
-- it is not already in dim.publisher table. 
INSERT INTO dim.publisher 
SELECT 
     -- Generate id using max id found in dim.publisher. 
     -- Start with id=1 if dim.publisher is empty. 
     (
       SELECT NVL(MAX(id), 0) 
       FROM dim.publisher 
     ) + ROW_NUMBER() OVER() AS id, 
     trk_key, 
     name 
FROM sta.publisher 
     -- Only insert record if trk_key is not found in dim.publisher table. 
     WHERE trk_key NOT IN (
       SELECT trk_key 
       FROM dim.publisher 
     ) 
4

这里是另一种方式产生1万个号码

with seq_0_9 as (
select 0 as num 
union all select 1 as num 
union all select 2 as num 
union all select 3 as num 
union all select 4 as num 
union all select 5 as num 
union all select 6 as num 
union all select 7 as num 
union all select 8 as num 
union all select 9 as num 
), seq_0_999 as (
select a.num + b.num * 10 + c.num * 100 as num 
from seq_0_9 a, seq_0_9 b, seq_0_9 c 
) 
select a.num + b.num * 1000 as num 
from seq_0_999 a, seq_0_999 b 
order by num 
+0

这很棘手。如何将它变成3000万? – Mio

+0

不错的技巧来生成一个小序列,而不是 – nightgaunt