2017-05-21 18 views
-1

メインテーブルX1には2つの列があります。 AとBです.Aは日付、Bは人名です。私は各日付にない人を以前に歴史的記録を持つ人にしたいと思っています。 たとえば、TomとLiliyは5/2のレコードを持っていますが、5/2より前の人を探したいと思います。 私は以前のデータでテーブルに参加しようとしましたが、歴史的記録で同じ名前を避ける方法はわかりません。ここでグループ(SQLまたはSAS)以外のデータの照合方法

Table X1    
A | B    
5/1  Tom    
5/1  Liliy   
5/1  Jack    
5/2  Tom 
5/2  Liliy 

私の予想結果である: 表X2
A | B
5/2ジャック

+0

はちょうど列 'B'、または列に一致するものを意味し、「ないX2に」い「A」も? – halfer

+0

(あなたの質問を編集しても構いませんが、私の良い編集を投げ捨ててください)編集する前に編集履歴を見てください。 – halfer

+0

申し訳ありません、編集を終了しました。 Aが含まれています。私は各日付の前に不一致部分を見つけたい。ありがとうございました。 – Sylvia

答えて

0

2人以外のすべての人を探していて、Aが実際に日付の列であるとすると、次のSQLクエリを実行できます。

SELECT * 
FROM X1 
WHERE A < Convert(datetime, '5/2') AND B NOT IN ('Tom', 'Liliy'); 
0

私はこれがあなたが探していると信じています。列に一度しか表示されない人の日付と名前が返されます。同じ名前のインスタンスが複数ある場合、COUNT(B)は1より大きい値になります。あなたの質問に基づいて

SELECT A, B 
FROM X1 
GROUP BY B 
HAVING COUNT(B) = 1 
+0

これは単なるサンプルデータですが、実際には多くの日付とレコードがあります – Sylvia

+0

@Sylviaあなたの例を考えれば、日付とレコードの数にかかわらず問題は解決します。あなたの出力と期待される出力を見せてくれますか? –

0

私は以下@Jonathan Porter

に似て答えを考えることができるで動作するように、より大きな出発データセットを持つことです。

/*Generate a more diverse starting dataset*/ 
data X1; 
    format A mmddyy9.; 
    array names [10] $ 20 ('Phillip','Wendi','Virgilio','Scotty','Melony','Rayford','Vince','Cody','Julissa','Marquerite'); 
    do i=1 to 30; 
     A = intnx('DAY', '01MAY2017'd, ceil(ranuni(3)*10)); 
     B = names[ceil(ranuni(3)*10)]; 
     output; 
    end; 
    drop names: i; 
run; 
proc sort data=X1 nodups; 
    by A B; 
run; 

データセットX1の開始:

A   B 
---------------------- 
5/2/2017 Rayford 
5/2/2017 Virgilio 
5/3/2017 Cody 
5/3/2017 Melony 
5/3/2017 Rayford 
5/3/2017 Wendi 
5/4/2017 Scotty 
5/5/2017 Rayford 
5/5/2017 Wendi 
5/6/2017 Rayford 
5/6/2017 Vince 
5/7/2017 Marquerite 
5/7/2017 Virgilio 
5/8/2017 Julissa 
5/8/2017 Rayford 
5/9/2017 Cody 
5/9/2017 Julissa 
5/9/2017 Marquerite 
5/9/2017 Virgilio 
5/9/2017 Wendi 
5/10/2017 Julissa 
5/10/2017 Phillip 
5/11/2017 Cody 
5/11/2017 Vince 

グループを検索カウントと最新の関連する日付:

proc sql; 
    create table X2 as 
    select max(A) as latest_A format=mmddyy9., /*Latest date to which a name (B) is associated*/ 
      B,         
      count(*) as count_B     /*Count of records associated with a given name (B)*/ 
    from X1 
    group by B; 
quit; 
proc sort data=X2; 
    by latest_A B; 
run; 

ジョナサンが述べたように、私はあなたが以下のX2でアスタリスクを持つレコードに興味を持っていると仮定します。

latest_A B   count_B 
------------------------------------ 
5/3/2017 Melony  1  *** 
5/4/2017 Scotty  1  *** 
5/8/2017 Rayford  5 
5/9/2017 Marquerite 2 
5/9/2017 Virgilio 3 
5/9/2017 Wendi  3 
5/10/2017 Julissa  3 
5/10/2017 Phillip  1  *** 
5/11/2017 Cody  3 
5/11/2017 Vince  2 
関連する問題