Function Parameters in GROUP BY clause cause errors

Поиск
Список
Период
Сортировка
От Davidson, Robert
Тема Function Parameters in GROUP BY clause cause errors
Дата
Msg-id 8333C841129E074E9F83FC80676BA76E0BF08D@exchg-sea3-03.ant.amazon.com
обсуждение исходный текст
Ответы Re: Function Parameters in GROUP BY clause cause errors  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: Function Parameters in GROUP BY clause cause errors  ("Christian Paul B. Cosinas" <cpc@cybees.com>)
Список pgsql-sql
<p align="LEFT"><span lang="en-us"><font face="Arial" size="2">When I use a parameter in a query which aggregates it
failswith a GROUP BY error.</font></span><span lang="en-us"></span><span lang="en-us"><font face="Arial" size="2"> What
syntaxcan I use to avoid this error?</font></span><span lang="en-us"></span><span lang="en-us"></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">CREATE TABLE test (email_creation_datetime
timestamp);</font></span><palign="LEFT"><span lang="en-us"><font face="Arial" size="2">INSERT INTO test VALUES
('2006-03-2009:00');</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">INSERT INTO test
VALUES('2006-03-20 09:15');</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">INSERT INTO
testVALUES ('2006-03-20 09:30');</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">INSERT
INTOtest VALUES ('2006-03-20 09:45');</font></span><span lang="en-us"></span><span lang="en-us"></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">Query without parameters works fine:</font></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">select to_char(to_timestamp(EXTRACT(HOUR FROM
em.email_creation_datetime)|| ':' || (EXTRACT(MINUTE FROM em.email_creation_datetime)::integer/30) * 30, 'HH24:MI'),
'HH24:MI')as TheInterval</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">from test
em</font></span><palign="LEFT"><span lang="en-us"><font face="Arial" size="2">group by 
to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM
em.email_creation_datetime)::integer/30)* 30, 'HH24:MI') , 'HH24:MI')</font></span><span lang="en-us"></span><span
lang="en-us"></span><palign="LEFT"><span lang="en-us"><font face="Arial" size="2">theinterval</font></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">09:30</font></span><p align="LEFT"><span lang="en-us"><font
face="Arial"size="2">09:00</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">But the same
querywith a parameter returns a GROUP BY error:</font></span><p align="LEFT"><span lang="en-us"><font face="Arial"
size="2">CREATEOR REPLACE FUNCTION EmailByInterval(IntervalMinutes int) RETURNS SETOF test AS $$</font></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">DECLARE rec RECORD;</font></span><p align="LEFT"><span
lang="en-us"><fontface="Arial" size="2">BEGIN</font></span><p align="LEFT"><span lang="en-us"><font face="Arial"
size="2">FORrec IN </font></span><p align="LEFT"><span lang="en-us">        <font face="Arial" size="2">select
to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM
em.email_creation_datetime)::integer/IntervalMinutes)* IntervalMinutes, 'HH24:MI'), 'HH24:MI') as
TheInterval</font></span><palign="LEFT"><span lang="en-us">        <font face="Arial" size="2">from test
em</font></span><palign="LEFT"><span lang="en-us">        <font face="Arial" size="2">group by 
to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM
em.email_creation_datetime)::integer/IntervalMinutes)* IntervalMinutes, 'HH24:MI') , 'HH24:MI')</font></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">LOOP</font></span><p align="LEFT"><span lang="en-us">       
<fontface="Arial" size="2">RETURN NEXT rec;</font></span><p align="LEFT"><span lang="en-us"><font face="Arial"
size="2">ENDLOOP;</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">RETURN;</font></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">END;</font></span><p align="LEFT"><span lang="en-us"><font
face="Arial"size="2">$$ LANGUAGE plpgsql;</font></span><span lang="en-us"></span><span lang="en-us"></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">Query returned successfully with no result in 70
ms.</font></span><spanlang="en-us"></span><span lang="en-us"></span><p align="LEFT"><span lang="en-us"><font
face="Arial"size="2">select * from emailbyinterval(30);</font></span><span lang="en-us"></span><span
lang="en-us"></span><palign="LEFT"><span lang="en-us"><font face="Arial" size="2">ERROR:  column
"em.email_creation_datetime"must appear in the GROUP BY clause or be used in an aggregate function</font></span><p
align="LEFT"><spanlang="en-us"><font face="Arial" size="2">CONTEXT:  SQL statement " select
to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM
em.email_creation_datetime)::integer/$1 ) *  $2 , 'HH24:MI'), 'HH24:MI') as TheInterval from test em group by
to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM
em.email_creation_datetime)::integer/$3 ) *  $4 , 'HH24:MI') , 'HH24:MI')"</font></span><p align="LEFT"><span
lang="en-us"><fontface="Arial" size="2">PL/pgSQL function "emailbyinterval" line 3 at for over select
rows</font></span><spanlang="en-us"></span><span lang="en-us"></span> 

В списке pgsql-sql по дате отправления:

Предыдущее
От: Maciej Piekielniak
Дата:
Сообщение: Re: How to optimize this query?
Следующее
От: "Daniel Caune"
Дата:
Сообщение: Custom type