2013-07-25 3 views
1

J'utilise Oracle Database 11g. J'ai une requête qui sélectionne, entre autres choses, un identifiant et une date d'une table. Fondamentalement, ce que je veux faire est de garder les lignes qui ont le même ID ensemble, puis trier ces "groupes" de rangées par la date la plus récente dans le "groupe"."Grouper" quelques lignes avant le tri (Oracle)

Donc, si mon résultat original était le suivant:

ID Date 
3 11/26/11 
1 1/5/12 
2 6/3/13 
2 10/15/13 
1 7/5/13 

La sortie que j'espère est:

ID Date 
3 11/26/11  <-- (Using this date for "group" ID = 3) 
1 1/5/12 
1 7/5/13  <-- (Using this date for "group" ID = 1) 
2 6/3/13 
2 10/15/13  <-- (Using this date for "group" ID = 2) 

Est-il possible de le faire?

+0

Merci pour la fixation de la mise en forme, je suis nouveau à ce – bobroxsox

Répondre

2

Une façon d'obtenir ceci est en utilisant des fonctions analytiques; Je n'ai pas d'exemple de ça pratique.

C'est une autre façon d'obtenir le résultat indiqué, sans utiliser une fonction analytique (ce qui ordonne d'abord par le most_recent_date pour chaque ID, puis par ID, puis par date):

SELECT t.ID 
    , t.Date 
    FROM mytable t 
    JOIN (SELECT s.ID 
       , MAX(s.Date) AS most_recent_date 
      FROM mytable s 
      WHERE s.Date IS NOT NULL 
      GROUP BY s.ID 
     ) r 
    ON r.ID = t.ID 
ORDER 
    BY r.most_recent_date 
    , t.ID 
    , t.Date 

Le « truc "ici est de retourner" most_recent_date "pour chaque ID, puis joignez-le à chaque ligne. Le résultat peut être ordonné par cela d'abord, puis par n'importe quoi d'autre.

(je pense aussi qu'il ya un moyen d'obtenir cette même commande en utilisant des fonctions analytiques, mais je ne dispose pas d'un exemple de cette pratique.)

1

Vous pouvez utiliser la fonction MAX ... KEEP avec votre agrégat pour créer votre genre clé:

with 
    sample_data as 
    (select 3 id, to_date('11/26/11','MM/DD/RR') date_col from dual union all 
    select 1, to_date('1/5/12','MM/DD/RR') date_col from dual union all 
    select 2, to_date('6/3/13','MM/DD/RR') date_col from dual union all 
    select 2, to_date('10/15/13','MM/DD/RR') date_col from dual union all 
    select 1, to_date('7/5/13','MM/DD/RR') date_col from dual) 
select 
    id, 
    date_col, 
    -- For illustration purposes, does not need to be selected: 
    max(date_col) keep (dense_rank last order by date_col) over (partition by id) sort_key 
from sample_data 
order by max(date_col) keep (dense_rank last order by date_col) over (partition by id); 
1

Voici la requête en utilisant des fonctions analytiques:

select 
    id 
, date_ 
, max(date_) over (partition by id) as max_date 
    from table_name 
    order by max_date, id 
;