[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.아마존 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.적색 편이 오늘 사용하면 날짜 기능을 사용하여 다수의 테이블에 공급하여 날짜 범위를 생성 할 수 있습니다.
적색 편이 오늘 사용하면 날짜 기능을 사용하여 다수의 테이블에 공급하여 날짜 범위를 생성 할 수 있습니다.
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.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.나는 비슷한 할 필요가 있지만, 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.다른 테이블에 조인 할 때 @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)
from https://stackoverflow.com/questions/17282276/using-sql-function-generate-series-in-redshift by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 사용 A는 WHERE 조건에 비해 절을 가입하는 이유? (0) | 2020.04.21 |
---|---|
[SQL] SQL Server 2005의 흥미로운 행동 "테이블에서 등 COLA, COLB을 선택"VS "테이블에서 선택 *" (0) | 2020.04.21 |
[SQL] 그것은 MySQL의에서 인덱싱 된 뷰를 가질 수 있습니까? (0) | 2020.04.21 |
[SQL] SELECT는 각 그룹에서 한 행을 반환 쿼리 (0) | 2020.04.21 |
[SQL] 어떻게 SQL 매개 변수를 전달하고, 내가 필요한 이유는 무엇입니까? (0) | 2020.04.21 |