Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> Re: An Interesting Grouping Question
"MacGregor, Ian A." wrote:
>
> Given the following Table
>
> emplid course_id
> ------ ---------
> 1 1
> 2 2
> 2 3
> 3 3
> 3 4
> 3 5
> 4 3
> 4 4
> 4 5
> 5 2
> 5 3
> 6 1
> 7 2
> 8 3
> 8 4
>
>--------------------------------------------------------------------------------------------
> What statement would you write to group employees by the set of courses they have
>taken. In otherwords each employee in a group must have taken the same as the
>others in the group, not one class more nor less. In this example the employees
>making up the groups would be
>
> 1,6
> 2,5
> 3,4
> 7
> and 8
>
> I had this posed by one of my developers. He had also come up with a solution
>which didn't take a relational approach. The approach is not exotic, and I suspect
>it will be proposed by many people. He'd like a relational one.
>
> Ian MacGregor
> Stanford Linear Accelerator Center
> ian_at_slac.stanford.edu
I don't think you can, unless, perhaps, you use the analytical functions which I have never had the opportunity to play with. Problem number 1 is getting an identifier for each set of courses. Since you must get this through a 'GROUP BY', the only chance is a numerical expression. An obvious candidate is something like sum(course_id * power(10, n -1)) where n is the order (starting with 1) of course ids suitably ordered for each employee - restarting from 1 with each employee. Getting n is the trouble. You cannot get it through rownums and in-line views, it would require some kind of ugly three-way correlation between views in the FROM clause and a subquery. The best solution I see, but it's not a 'pure play' one, is to create a function
create or replace function course_index(p_emplid in number,
p_course_id in number)return number
from (select course_id from courses_taken where emplid = p_emplid order by 1 desc) b) a
return null;
end;
Then it becomes relatively easy to write
select emplid, sum(course_id * power(10, course_index(emplid,
course_id) - 1) course_set
from courses_taken
group by emplid
and then to do whatever you want.
-- Regards, Stephane Faroult Oriole Corporation Voice: +44 (0) 7050-696-269 Fax: +44 (0) 7050-696-449 Performance Tools & Free Scripts -------------------------------------------------------------- http://www.oriole.com, designed by Oracle DBAs for Oracle DBAs -------------------------------------------------------------- -- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: Stephane Faroult INET: sfaroult_at_oriole.com Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051 San Diego, California -- Public Internet access / Mailing Lists -------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).Received on Thu Aug 30 2001 - 16:26:24 CDT
![]() |
![]() |