The query below uses a join (self-join). You can use
SQL99 RANK() functions if you want to avoid the
self-join.

For e.g., if you have Oracle 9i or above:

create table x(symbol varchar2(30), 
               prodid  varchar2(30), 
               mydate date);

select symbol, prodid
from   (select symbol, prodid,
               RANK() OVER (PARTITION BY symbol 
                            ORDER  BY mydate DESC) 
               as myrank
        from   x
        where  mydate <= ...)
where  myrank = 1;



[Jprogramming] SQL equivalent of J function
Oleg Kobchenko olegykj at yahoo.com wrote:

> You don't need to join tables, since x has both  >
fields.

> create table x (
>   symbol varchar,
>   prodid varchar,
>   date date
> );

> -- select mapping effective on given date

> select symbol,prodid
> from x
> where date = (select max(date) from x where date <=
?);


--- Dan Bron <jf at dbron.net> wrote:

> I need some help with SQL.
> 
> I have a set of stock symbols and a set of internal
product IDs which map 1-to-1 to those
> symbols.  Sometimes the mapping changes (for
example, when the symbol changes its meaning on the
> exchange).  
> 
> So I have a SQL table that tells me the symbol, the
product ID, and the date.  This table was
> initialized with all the symbols and their first
product IDs, and a new row is added with
> symbol, (new) product_id, and date whenever a
mapping changes.
> 
> What I want is, for a given set of symbols, and a
particular date, the product ID for that
> symbol as of that date.  
> 
> Obviously, the mapping for a particular symbol may
changed 0 or more times on or before that
> date, so the table will have 1 or more symbol,
product_id, date entries for each symbol.
> 
> In J, a model of the function I want is:
> 
> 
>       map_it =: verb define
>          filter    =.  (symbol__x e. symbol__y) *.
date__x <: some_date
>       
>          rows      =.  filter # prod_id__x ,. date__x
> 
>            prod_ids  =.  ({.@:/:/ @: |:/.~ {."1)
rows
>       
>          symbol__y ,. prod_ids
>       )
> 
>          NB.            {.@:/: lots slower than {~ (i.
>./)@:;
> 
> 
> where the arguments to the verbs are two objects
(locales) representing the tables and, e.g. 
> symbol__x  is the symbol column from the left table.
> 
> What I need is the SQL equivalent.  I made the
follow attempt, but it doesn't work:
> 
> 
>       SELECT 
>                TOP 1 
>                        y.symbol,
>                        x.prod_id,
> 
>       FROM 
>                        x, 
>                        y
> 
>       WHERE 
>                       x.date <= @some_date
>               AND
>                  x.symbol = y.symbol
> 
>       GROUP BY
>               y.symbol
> 
>       ORDER BY
>               x.date 
>       DESC
> 
> 
> the SQL engine complains that for each column I want
in the output, I need to either include it
> in the GROUP BY clause, or use an aggregation
function on it in the SELECT clause.   Apparently
> TOP 1 doesn't count as an aggregation function.
> 
> Suggestions?
> 
> -Dan



__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to