복붙노트

[SQL] 적색 편이에 SQL 함수 generate_series ()을 사용하여

SQL

적색 편이에 SQL 함수 generate_series ()을 사용하여

나는이 적색 편이 시리즈의 기능을 생성 사용하고 싶습니다,하지만 성공하지 않았습니다.

적색 편이 문서는 지원되지 않는 말한다. 다음 코드는 작업을 수행합니다 :

select *
from generate_series(1,10,1)

출력 :

1
2
3
...
10

나는 날짜와 동일한 작업을 수행하고 싶습니다. 나는 변화를 포함한 다수를 시도했다 :

select *
from generate_series(date('2008-10-01'),date('2008-10-10 00:00:00'),1)

추방 :

 ERROR: function generate_series(date, date, integer) does not exist
 Hint: No function matches the given name and argument types.
 You may need to add explicit type casts. [SQL State=42883]

또한 시도 :

select *
from generate_series('2008-10-01 00:00:00'::timestamp,
'2008-10-10 00:00:00'::timestamp,'1 day')

그리고 시도 :

select *
from generate_series(cast('2008-10-01 00:00:00' as datetime),
cast('2008-10-10 00:00:00' as datetime),'1 day')

모두 쫓아 :

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. [SQL State=42883]

나는 다른 게시물에서이 코드를 사용할 것처럼하면되지 본다 :

SELECT to_char(DATE '2008-01-01'
+ (interval '1 month' * generate_series(0,57)), 'YYYY-MM-DD') AS ym

인수로 SQL 함수의 PostgreSQL generate_series ()

해결법

  1. ==============================

    1.아마존 Redshift에 PostgreSQL의 8.0.2을 기반으로 보인다. generate_series에 타임 스탬프 인수 ()는 8.4에서 추가되었다.

    아마존 Redshift에 PostgreSQL의 8.0.2을 기반으로 보인다. generate_series에 타임 스탬프 인수 ()는 8.4에서 추가되었다.

    그 문제를 비켜 이런 식으로 뭔가는 Redshift에에서 작동 할 수 있습니다.

    SELECT current_date + (n || ' days')::interval
    from generate_series (1, 30) n
    

    그것은 내가 테스트 할 수 있습니다 초기 버전의 PostgreSQL 8.3에서 작동합니다. 그것은 8.0.26에 설명합니다.

    나중 . . .

    generate_series은 () Redshift에 지원되지 않는 것 같습니다. 하지만 generate_series에서 선택 * (1,10,1)이 위의 구문은 적어도 당신에게 싸움의 기회를 제공, 작업을 수행 것을 확인했습니다 주어진. (간격 데이터 유형도 Redshift에에 지원되지 않는 것으로 설명되지만).

    그래도 나중에. . .

    또한 정수의 테이블을 만들 수 있습니다.

    create table integers (
      n integer primary key
    );
    

    그것을 채우기 그러나 당신은 좋아한다. 당신은 테이블을 덤프, 로컬 generate_series ()를 사용하고, Redshift에 그것을로드 할 수 있습니다. (나도 몰라, 내가 Redshift에 사용하지 마십시오.)

    어쨌든, 당신은 generate_series에 () 또는 간격 데이터 유형에 직접 참조하지 않고 해당 테이블과 간단한 날짜 계산을 할 수 있습니다.

    select (current_date + n)
    from integers
    where n < 31;
    

    즉 적어도 8.3에서 작동합니다.

  2. ==============================

    2.적색 편이 오늘 사용하면 날짜 기능을 사용하여 다수의 테이블에 공급하여 날짜 범위를 생성 할 수 있습니다.

    적색 편이 오늘 사용하면 날짜 기능을 사용하여 다수의 테이블에 공급하여 날짜 범위를 생성 할 수 있습니다.

    select (getdate()::date - generate_series)::date from generate_series(1,30,1)
    

    이 나를 위해 생성

    date
    2015-11-06
    2015-11-05
    2015-11-04
    2015-11-03
    2015-11-02
    2015-11-01
    2015-10-31
    2015-10-30
    2015-10-29
    2015-10-28
    2015-10-27
    2015-10-26
    2015-10-25
    2015-10-24
    2015-10-23
    2015-10-22
    2015-10-21
    2015-10-20
    2015-10-19
    2015-10-18
    2015-10-17
    2015-10-16
    2015-10-15
    2015-10-14
    2015-10-13
    2015-10-12
    2015-10-11
    2015-10-10
    2015-10-09
    2015-10-08
    
  3. ==============================

    3.generate_series () 함수는 완전히 Redshift에 의해 지원되지 않습니다. 개발자 가이드의 지원되지 않는 PostgreSQL의 기능 섹션을 참조하십시오.

    generate_series () 함수는 완전히 Redshift에 의해 지원되지 않습니다. 개발자 가이드의 지원되지 않는 PostgreSQL의 기능 섹션을 참조하십시오.

    최신 정보

    generate_series 지금 적색 편이 노력하고 있습니다.

    SELECT CURRENT_DATE::TIMESTAMP  - (i * interval '1 day') as date_datetime 
    FROM generate_series(1,31) i 
    ORDER BY 1
    

    이는 지난 30 일 날짜를 생성합니다

    참고 : generate_series 아마존 Redshift에에서 작동

  4. ==============================

    4.나는 비슷한 할 필요가 있지만, 7 일간 5 분 간격. 그래서 여기에 CTE 기반 해킹의 (추한하지만 너무 자세한)

    나는 비슷한 할 필요가 있지만, 7 일간 5 분 간격. 그래서 여기에 CTE 기반 해킹의 (추한하지만 너무 자세한)

    INSERT INTO five_min_periods
    WITH 
    periods  AS (select 0 as num UNION select 1 as num UNION select 2 UNION select 3 UNION select 4 UNION select 5 UNION select 6 UNION select 7 UNION select 8 UNION select 9 UNION select 10 UNION select 11),
    hours    AS (select num from periods UNION ALL select num + 12 from periods),
    days     AS (select num from periods where num <= 6),
    rightnow AS (select CAST( TO_CHAR(GETDATE(), 'yyyy-mm-dd hh24') || ':' || trim(TO_CHAR((ROUND((DATEPART (MINUTE, GETDATE()) / 5), 1) * 5 ),'09')) AS TIMESTAMP) as start)
    select  
      ROW_NUMBER() OVER(ORDER BY d.num DESC, h.num DESC, p.num DESC) as idx
      , DATEADD(minutes, -p.num * 5, DATEADD( hours, -h.num, DATEADD( days, -d.num, n.start ) ) ) AS period_date
    from days d, hours h, periods p, rightnow n
    

    다른 세대 계획이 확장 할 수 있어야합니다. 여기에 트릭은 데카르트의 제품이 증식 (즉, 어떤 절은 WHERE / 가입)에 가입 사용하는 손으로 만들어진 CTE의 필요한 단위를 생산하고 앵커 날짜에 적용 할 수 있습니다.

  5. ==============================

    5.다른 테이블에 조인 할 때 @Ryan 턱과 @Slobodan Pejic의 generate_series ()의 코멘트를 Redshift에 작동하지 않습니다.

    다른 테이블에 조인 할 때 @Ryan 턱과 @Slobodan Pejic의 generate_series ()의 코멘트를 Redshift에 작동하지 않습니다.

    내가 사용하는 해결 방법은 쿼리에서 시리즈의 모든 값을 작성했다 :

    SELECT
    '2019-01-01'::date AS date_month
    UNION ALL
    SELECT
    '2019-02-01'::date AS date_month
    

    이 같은 파이썬 함수를 사용하여 :

    import arrow
    
    def generate_date_series(start, end):
        start = arrow.get(start)
        end = arrow.get(end)
    
        months = list(
            f"SELECT '{month.format('YYYY-MM-DD')}'::date AS date_month"
            for month in arrow.Arrow.range('month', start, end)
        )
    
        return "\nUNION ALL\n".join(months)
    
  6. from https://stackoverflow.com/questions/17282276/using-sql-function-generate-series-in-redshift by cc-by-sa and MIT license