2016-03-16 2 views
0

J'ai donc un ensemble de données où je veux sélectionner les enregistrements les plus proches de point X pour ma sortie,Comment sélectionner dans le plus proche chose à Y SAS comme point de départ

Ce que j'est

PROC SQL ; 
    create table Check_vs_Excel2 as 
    SELECT PROPERTY, START_DATE, END_DATE, DAY_OF_WEEK, MARKET_CODE_PREFIX, RATE_PGM, ROOM_POOL, QUOTE_SERIES_NO, QUOTE_POSITION 
    FROM Sbtddraf.Vssmauditdraftfull 
     group by Property, RATE_PGM 
    having START_DATE = MAX(START_DATE); 

quit; 

Je veux prendre le START_DATE = Max (Start_DATE); et changer quelque chose qui est (efficace)

ayant START_DATE = près de (aujourd'hui())

Conseil serait très apprécié

Répondre

1

Dans SQL votre requête serait d'utiliser une sous-requête corrélée:

SELECT PROPERTY, START_DATE, END_DATE, DAY_OF_WEEK, MARKET_CODE_PREFIX, RATE_PGM, ROOM_POOL, QUOTE_SERIES_NO, QUOTE_POSITION 
FROM Sbtddraf.Vssmauditdraftfull AS t 
-- group by Property, RATE_PGM 
WHERE START_DATE = 
    (select MAX(START_DATE) 
    FROM Sbtddraf.Vssmauditdraftfull AS t2 
    where t1.Property = t2.Property 
     and t1.RATE_PGM = t2.RATE_PGM 
) 
0

la proximité est 'près de'? Cela pourrait être ce que vous cherchez

 where START_DATE between TODAY() and DATE_ADD(TODAY(),INTERVAL 30 DAY) 
+0

J'ai essayé ceci et bidouillé un peu mais je ne peux pas faire date_add dans proc sql. Savez-vous comment je pourrais utiliser INTNX dans quelque chose de similaire? – Kumachorou

+0

Je voudrais essayer quelque chose le long de ces lignes, mais je ne suis pas sûr à 100% que START_DATE entre TODAY() et INTNX ('jour', AUJOURD'HUI (30) –

0

En supposant que je comprends que vous voulez la ligne qui a la différence minimale absolue entre date_début et aujourd'hui() (donc, MIN(ABS(START_DATE-TODAY()))), vous pouvez faire une requête un peu en désordre avec la clause ayant ainsi:

data have; 
    do id = 2 to 9; 
    do start_date = '02MAR2016'd to '31MAR2016'd by id; 
     output; 
    end; 
    end; 
run; 

proc sql; 
    select id, start_date format=date9. 
    from have 
    group by id 
    having abs(start_date-today()) = min(abs(start_date-today())); 
quit; 

Je n'aime pas en partie parce qu'il est non s tandard SQL et donne une note sur la fusion des données (c'est non standard et vous donne cette note parce que vous utilisez une valeur qui n'est pas vraiment disponible dans un groupe), et en partie parce qu'il vous donne plusieurs lignes si deux sont lié (voir id = 4 si vous l'exécutez le 16/03/2016).

Une version sous-requête corrélée, ce qui évite au moins la note de réémergentes (mais ne fait effectivement la même chose):

proc sql; 
    select id, start_date format=date9. 
    from have H 
    where abs(start_date-today()) = (
     select min(abs(start_date-today())) 
     from have V 
     where H.id=V.id 
    ); 
quit; 

donne encore deux pour id = 4 bien (sur 16/3/2016). Vous devriez trouver un moyen de choisir s'il y a deux réponses possibles (ou peut-être que vous voulez strictement moins que?). Cela fait une sous-requête pour déterminer quelle est la plus petite différence puis la renvoie.

+0

question sur ce, qu'est-ce que V et H ont signifié? – Kumachorou

+0

'V' et' H' sont des alias de table - juste des choses qui vous permettent d'écrire une déclaration plus courte, comme 'H.id = V.id'. De plus, puisque 'has' est utilisé deux fois ici, vous devez utiliser un alias de table - sinon il n'y a aucun moyen d'identifier lequel' a 'est quel. – Joe