在PROC SQL中提取最大值的重复记录
我正在使用一个包含多个重复记录的数据库。它有一个不正确的活动记录指示器,所以我基本上必须使用记录的日期手动创建一个活动指示器 请参见以下数据示例:在PROC SQL中提取最大值的重复记录,sql,sas,duplicates,max,Sql,Sas,Duplicates,Max,我正在使用一个包含多个重复记录的数据库。它有一个不正确的活动记录指示器,所以我基本上必须使用记录的日期手动创建一个活动指示器 请参见以下数据示例: application_nbr date Amount 138352 4/26/2017 $10,000.00 138352 4/22/2017 $9,500.00 553652 5/1/2017 $2,500.00 332621
application_nbr date Amount
138352 4/26/2017 $10,000.00
138352 4/22/2017 $9,500.00
553652 5/1/2017 $2,500.00
332621 4/15/2017 $7,500.00
332621 4/3/2017 $8,500.00
我需要一个查询,可以从上面得到:
application_nbr date Amount
138352 4/26/2017 $10,000.00
553652 5/1/2017 $2,500.00
332621 4/15/2017 $7,500.00
我真的不知道如何解决这个问题。我在考虑使用max(date)的某种子查询?我知道我不能在where子句中使用像max这样的函数。有没有一个相当简单的方法来实现这一点?更新:
SELECT a.*
FROM table_name a
JOIN (SELECT application_nbr, MAX(date) AS max_date
FROM table_name
GROUP BY application_nbr) b
ON a.application_nbr = b.application_nbr
更新:
SELECT a.*
FROM table_name a
JOIN (SELECT application_nbr, MAX(date) AS max_date
FROM table_name
GROUP BY application_nbr) b
ON a.application_nbr = b.application_nbr
由于您正在使用SAS数据集:
proc sort data=have;
by application_nbr date;
run;
data want;
set have;
by application_nbr date;
if first.date;
run;
或者如果您真的想使用proc-sql,那么
proc sql;
select a.*,b.amount
from
(select application_nbr,max(date) as date
from have
group by application_nbr) a
inner join
have b
on a.application_nbr=b.application_nbr;
quit;
如果有任何疑问,请告诉我。因为您正在使用SAS数据集:
proc sort data=have;
by application_nbr date;
run;
data want;
set have;
by application_nbr date;
if first.date;
run;
或者如果您真的想使用proc-sql,那么
proc sql;
select a.*,b.amount
from
(select application_nbr,max(date) as date
from have
group by application_nbr) a
inner join
have b
on a.application_nbr=b.application_nbr;
quit;
如果有任何疑问,请告诉我。有几种方法可以做到这一点。在
proc-sql
中,我将进行重新合并:
proc sql;
select t.*
from (select t.*, max(date) as maxdate
from t
)
where date = maxdate;
在SQL中执行此操作的典型方法是:
select t.*
from t join
(select application_nbr, max(date) as maxdate
from t
group by application_nbr
) tt
on t.application_nbr = tt.application_nbr;
有几种方法可以做到这一点。在
proc-sql
中,我将进行重新合并:
proc sql;
select t.*
from (select t.*, max(date) as maxdate
from t
)
where date = maxdate;
在SQL中执行此操作的典型方法是:
select t.*
from t join
(select application_nbr, max(date) as maxdate
from t
group by application_nbr
) tt
on t.application_nbr = tt.application_nbr;
在HAVING子句中使用MAX()。ie
having date=max(date)
@Reeza我尝试使用having with max(date),它只提取表中日期最高的记录。它刚刚提取了日期为2017年5月1日的记录。您是否在应用程序中包含GROUP BY?请在HAVING子句中使用MAX()。iehaving date=max(date)
@Reeza我尝试使用having with max(date),它只提取表中日期最高的记录。它刚刚调出了日期为2017年5月1日的记录。你是否在申请中加入了一个团员?对不起,我没有在我的帖子上适当地解释我的问题。为了更准确,我做了编辑。数据库中还有其他字段我不想在其上使用摘要函数。这就是为什么按照您推荐的方式分组。由于您正在使用内部连接,所以不需要“where”条件。@G.Arima您对where子句的看法是正确的。我更新了。很抱歉,我没有在我的帖子上适当地解释我的问题。为了更准确,我做了编辑。数据库中还有其他字段我不想在其上使用摘要函数。这就是为什么按照您推荐的方式分组。由于您正在使用内部连接,所以不需要“where”条件。@G.Arima您对where子句的看法是正确的。我更新了它。