2016-09-26 59 views
0

我正在尝试创建一个Select语句,以按照361次(0到360)的顺序复制每个唯一行(由'位置'字段)。还会创建一个附加列,显示序列(0到360)。这样做的目的是使用半径和度数字段计算long long每个lat的坐标,使其在Tableau内呈现为一个圆。SQL:使用额外的运行顺序字段复制行

这是原始样本表。

enter image description here

这是最后的希望的输出。

enter image description here

任何人都可以帮忙吗?

在逗号样本数据分隔〜

Location,Radius,Latitude,Longitude 
A,500,31.4799,88.38783 
B,1000,35.580941,77.01125 
C,800,37.492528,88.797115 

EDIT:有在原来的表50个加行。

+0

哪个数据库? –

+0

它是在vertica – Jake

回答

1

我不相信Vertica具有相当于Postgres的generate_series()。你可以嘲笑它,如果你有一台至少有361行:

with n as (
     select row_number() over() - 1 as n 
     from (select s.* from sample s limit 361) s 
    ) 
select s.*, n.n as degress 
from sample s cross join 
    n; 

在Vertica的,order by是可选的row_number()功能。

+0

哦,亲爱的,问题是我只有50多行在表中〜任何替代方法在你的意见? – Jake

+1

啊,用第三行代替第三行中的'样本'表,并且有超过360行的其他表将取消对原始表格行的依赖。将标记你的答案是正确的。谢谢! – Jake

0

您还可以在Vertica的滥用time series生成一个序列,而不需要任何表都:

with mydegrees as (
    SELECT extract(epoch from slice_time - to_timestamp(0)) Degree 
    from (select to_timestamp(0) ts 
      union all 
      select to_timestamp(0) + interval '360 seconds') x 
    TIMESERIES slice_time AS '1 second' OVER (ORDER BY ts) 
) 
select t.*, d.Degree 
from mytable t cross join 
    mydegrees d; 

基本上我们只需设置一个启动/到时间戳0到360秒,然后我们提取了“秒因为每个时间片的历元0'(使用1秒的时间片)。