How do I get the first row filtering some values out? I used row_number() over(partition by Name ORDER BY Date) to get the order (See example below). But I need, the rank will start at the last occurrence of Type = B (See expected output)
SELECT Name, Age, Type, Date, 
       row_number() over(partition by Name ORDER BY Date) as Rank
FROM TableA;
For example :
Name   Age   Type   Date          Rank
Ben    12      A    2013/02/01    1 
Rod    14      A    2013/02/05    2
Zed    13      B    2013/03/09    3
Ken    12      A    2013/04/02    4 
Jed    14      B    2013/05/01    5
Mar    13      A    2013/05/04    6
Nic    12      A    2013/06/02    7
Jen    15      A    2013/06/09    8
Expected Output :
Name   Age    Type   Date         Rank
Mar    13      A    2013/05/04    1
Nic    12      A    2013/06/02    2
Jen    15      A    2013/06/09    3
                Try
WITH qry AS 
(
  SELECT "Name", "Age", "Type", "Date", 
         ROW_NUMBER() OVER (PARTITION BY "Type" ORDER BY "Date") rank
  FROM TableA
)
SELECT "Name", "Age", "Type", "Date"
  FROM qry
 WHERE rank = 1
Output:
| NAME | AGE | TYPE |                            DATE |
-------------------------------------------------------
|  Ben |  12 |    A | February, 01 2013 00:00:00+0000 |
|  Zed |  13 |    B |    March, 09 2013 00:00:00+0000 |
Here is SQLFiddle demo
There is another possibility: You could wrap it in a subquery:
select
    t.*
  from
    (SELECT "Name", "Age", "Type", "Date", 
         ROW_NUMBER() OVER (PARTITION BY "Type" ORDER BY "Date") rank
       FROM TableA
     ) t
  where
    rank = 1
"Sub queries" and "common table expressions (with)" behave differently, so have a look at these approaches. It depends on your case, if one is mandatory (dealing with side-effects) or one is faster. In case of Oracle, there is even a materialize hint. "Per SQL standard, CTEs offer an optimization fence feature" (this is an adapted quote from here).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With