Re: Incorrect Query
Date: Wed, 9 Jul 2008 04:08:43 -0700 (PDT)
Message-ID: <664d90f2-f1d1-4ec1-aad7-f270eac14ae1@79g2000hsk.googlegroups.com>
On Jul 8, 8:09 pm, Mtek <m..._at_mtekusa.com> wrote:
> Hi,
>
> I'm trying to use an analytic function to get the first row in a group
> ordered by a date.
>
> SELECT customer_id, action,
> FIRST_VALUE(TRUNC(action_date))
> OVER (PARTITION BY customer_id
> ORDER BY action_date DESC) AS LAST_DATE
> FROM email_product_hist
> ORDER BY customer_id;
>
> Customer ID Action Action Date
> 413 D 29-AUG-07
> 413 D 29-AUG-07
> 416 D 09-SEP-06
> 416 D 09-SEP-06
> 416 A 09-SEP-06
> 416 D 09-SEP-06
> 416 A 09-SEP-06
> 416 D 09-SEP-06
> 421 D 15-APR-08
> 443 D 04-MAY-04
>
> Now, I have truncated the date, so the minutes should not matter.
> But, because I use FIRST_VALUE and I am partitioning on the customer
> ID, I thought it would basically group it by customer ID and then get
> the first record, as the group is ordered by date DESC.
>
> But, I am getting duplicated, which I should not be. Anyone see what
> is wrong with my query?
>
> Always thanks!
>
> John.
Its non-deterministic (I think thats the word) i.e. it returns all the rows in your set showing the first_value figure against each one in the group.
Consider a version using scott.emp:
select deptno, sal, first_value(ename)
over (partition by deptno order by sal asc) as fv
from (select * from emp
order by empno desc)
It doesn't group it doesn't aggregate it returns all the rows in the set the fv column just shows the first value in the partitioned group each time.
DEPTNO SAL FV
--------- --------- ---------- 10 1300 MILLER 10 2450 MILLER 10 5000 MILLER 20 800 SMITH 20 1100 SMITH 20 2975 SMITH 20 3000 SMITH 20 3000 SMITH 30 950 JAMES 30 1250 JAMES 30 1250 JAMES 30 1500 JAMES 30 1600 JAMES 30 2850 JAMES
You get the idea? Perhaps you want a group by clause in their somewhere.
Cheers Received on Wed Jul 09 2008 - 06:08:43 CDT