2017-08-07 1 views
0

Salut J'ai les données suivantes dans le tableau client.Date minimum par an avec le drapeau

CUST_ID  DATE 
ab13563590 6/1/2008 
ab13563591 1/1/2008 
ab13563592 2/1/2008 
ab13563593 8/1/2010 
ab13563594 7/1/2010 
ab13563595 9/1/2008 
ab13563596 4/1/2008 
ab13563597 10/1/2008 
ab13563598 3/1/2009 
ab13563599 5/1/2009 

je besoin d'un drapeau calculé pour lequel la date minimum pour chaque année sera « Y » et « N » pour le repos d'entre eux. données attendues devraient ressembler à

CUST_ID  DATE FLAG 
ab13563590 6/1/2008 N 
ab13563591 1/1/2008 Y 
ab13563592 2/1/2008 N 
ab13563593 8/1/2010 N 
ab13563594 7/1/2010 Y 
ab13563595 9/1/2008 N 
ab13563596 4/1/2008 N 
ab13563597 10/1/2008 N 
ab13563598 3/1/2009 Y 
ab13563599 5/1/2009 N 

Ce que je l'ai fait est, je pris groupe par année avec min (date) et les données chargées dans la table de temp et rejoindre retour à la table réelle et a écrit une déclaration de cas. Mais je suppose que cela peut être résolu dans une seule déclaration de sélection.

Merci à l'avance

Répondre

2

Vous pouvez résoudre cela en utilisant des fonctions de la fenêtre:

SELECT cust_id, 
    date, 
    CASE WHEN date = min(date) OVER (PARTITION BY EXTRACT(YEAR FROM date) ORDER BY date) THEN 'Y' ELSE 'N' END AS Flag 
FROM table; 

qui comparera la date de la ligne actuelle à la date minimum pour l'année. Si elles sont égales, alors vous obtenez un «Y».

+0

Parfait, merci pour la réponse rapide. – neoo

1

Essayez ceci:

select cust_id,date, 
case 
when date = (select min(date) as min_date from customer where to_char(cust.date,'yyyy') = to_char(date,'yyyy')) 
then 'Y' else 'N' end as flag 
from customer cust