有没有办法使用Redshift中的查询结果生成一个系列?

时间:2018-02-08 21:04:22

标签: sql amazon-redshift

我想使用表中某个值的max作为生成的系列的最大值,以获得没有孔的表。我试过了

SELECT n
FROM (SELECT MAX(amount) as max FROM my_table) h, 
generate_series(1,h.max,1) n

以及

SELECT *
FROM generate_series(1,10,1) n
RIGHT JOIN  (SELECT MAX(amount) AS max FROM my_table) h ON h.max > n

生成以下错误

java.lang.RuntimeException: com.amazon.support.exceptions.ErrorException: [Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;

我尝试在关闭时准备最大值,我尝试在关闭时准备generate_series但没有任何工作。我总是遇到同样的错误。

3 个答案:

答案 0 :(得分:1)

因为我引用了文档,这对于评论来说太长了。

Amazon Redshift不支持generate_series()

  

Amazon Redshift不支持这些PostgreSQL功能。

     

设置返回功能

     
      
  • GENERATE_SERIES()
  •   
  • GENERATE_SUBSCRIPTS()
  •   

这使您在Redshift中难以解决的问题比您预期的要困难。我建议您提出另一个问题,并提供有关如何使用数据的更多详细信息。例如:

  • 您只是在寻找差距吗?
  • 表格是否相当密集 - 这意味着与值的数量相比,差距相对较小?
  • 你有另一个"理货"有足够行来生成值的表吗?

答案 1 :(得分:1)

使用讨论 generate_series() method fails in Redshift 我为我的具体问题找到了解决方案。我首先创建一个足够大的范围(这可能在将来会出现问题,任何更好的解决方案都非常受欢迎)。然后我加上这个范围,我的最大值是范围值小于我的最大值。

with
 range as (
    select (row_number() over (order by true)) as num
    from [some_big_enough_table] limit 30
)
SELECT num FROM range INNER JOIN (SELECT MAX(amount) m FROM my_table) h
WHERE num <= m

答案 2 :(得分:0)

你是否试图用你所拥有的东西来设定一个任意限制的范围?这样的事情可能有用:

with range as (
    select num from (
        select row_number() over (order by true) as num
        from [large_table]
        limit 30 -- some reasonable upper limit
    ) where num < (select max(amount) m from my_table)+1
)

对于零基础,只需从num:select num-1 as num from

中减去1