Search Postgresql Archives

Re: GROUP BY requirement

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2005-08-26 at 14:39, Bill Moseley wrote:
> I'm wondering if adding a GROUP BY (as required by Postgres) will
> change the results of a select on a view.
> 
> I have the following view which joins a "class" with a teacher.  A
> teacher is a "person" and I have an "instructors" link table.
> 
> CREATE VIEW class_list  (id, class_time, instructor )
>     AS
>         SELECT DISTINCT ON(class.id) 
>                class.id, class.class_time, person.first_name
> 
>           FROM class, instructors, person
>          WHERE instructors.person = person.id
>            AND class.id = instructors.class;
> 
> I also have a table "registration" that links students with a class.
> The registration table has a "reg_status" column to say if they are
> confirmed or on the wait_list.  So when showing the above I'd also
> like to see how many students are confirmed and on the wait_list.
> 
> DROP VIEW cl;
> CREATE VIEW cl  (id, class_time, instructor, 
>                     confirmed_cnt, wait_list_cnt)
> AS
>     SELECT DISTINCT ON(class.id) 
>            class.id, class.class_time, person.first_name,
>            sum (CASE WHEN registration.reg_status = 1 THEN 1 ELSE 0 END) as confirmed_cnt,
>            sum (CASE WHEN registration.reg_status = 2 THEN 1 ELSE 0 END) as wait_list_cnt,
> 
>       FROM class, instructors, person, registration
>      WHERE instructors.person = person.id
>        AND class.id = instructors.class
>        AND class.id = registration.class
> 
>   GROUP BY class.id, class.class_time, person.first_name;
> 
> PostgreSQL requires the GROUP BY.  But, I'm not clear how the GROUP BY
> might change the results between the two views above.
> 
>   http://www.postgresql.org/docs/8.0/static/sql-select.html#SQL-GROUPBY
> 
> says:
> 
>     When GROUP BY is present, it is not valid for the SELECT list
>     expressions to refer to ungrouped columns except within aggregate
>     functions, since there would be more than one possible value to
>     return for an ungrouped column.
> 
> Frankly, I cannot see how it might change results of a select between
> the two views.  Am I missing something?

OK, distinct on suffers from this problem.  Given the following simple
dataset:

mytable:
a | b
------
1 | 0
1 | 1

select distinct on (a) a,b from mytable;

One can see how the possible results are:

1,0 and 1,1, right?  All depending on the order in which they are
fetched.

The same would be true if you could do a group by on a and select b:

select a,b from mytable group by a;

Right?

Now, if it's impossible for your dataset to return such sets, due to the
way it's built, it is likely not fully normalized.  I.e. you have data
like this:

classid | instructorname | moreinfo...
--------------------------------------
1 | 'John Smith' | 'information'
1 | 'John Smith' | 'even more information'

and so on.  Or your join is creating such a data set.

---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

               http://archives.postgresql.org

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux