在 SAS 中使用各种条件删除重复项

Removing duplicates using various condition in SAS

我有如下数据集

Id  Site    Date
1   A   01-01-2021
1   A   02-02-2021
1   A   08-06-2021
1   A   09-06-2021
2   B   03-03-2021
2   B   08-05-2021
2   B   10-07-2021
2   B   15-07-2021

在上面的数据集中,我想根据几个条件删除重复项- 1.If 日期小于 08JUNE2021 并且网站是 A 然后保留最近日期的 id

2.If 日期大于 2021 年 6 月 8 日并且网站是 A 然后保持 id 为最近的日期

3.If 日期小于 2021 年 7 月 9 日并且网站是 B 然后保持 ID 为最近的日期

4.If 日期大于 2021 年 7 月 9 日并且站点是 B 保持 ID 为最新日期

下面给出我想要的条件数据集后

Id  site    Date
1   A   02-02-2021
1   A   09-06-2021
2   B   08-05-2021
2   B   15-07-2021

我试过数据的代码

proc sql; create table want as select * from (select ,count() as count, case when count()>1 and Date>"07JUN2021"d then 1 when count()>1 and Date<"07JUN2021"d then 2 else count(*) end as flag from z group by id) where site="A"; quit; run;

我喜欢的一种方法是创建一个 'group' 变量,让您可以识别分组。在这里,我展示了如何使用信息格式来做到这一点。如果您始终只有两个组('before' 日期和 'after' 日期),这是一个很好的方法;如果您有两个以上的组,还有其他选择。另请注意,我假设您的意思是小于和(不小于);如果您确实想明确排除站点 A 的 6 月 8 日记录,则需要进行一些调整。

data have;
input Id  Site $ Date :ddmmyy10.;
format date date9.;
datalines;
1   A   01-01-2021
1   A   02-02-2021
1   A   08-06-2021
1   A   09-06-2021
2   B   03-03-2021
2   B   08-05-2021
2   B   10-07-2021
2   B   15-07-2021
;;;;
run;

*Create an informat that maps each site to the pivot date;
proc format;
  invalue site_datei
  'A' = '08JUN2021'd
  'B' = '09JUL2021'd
  ;
run;

* Now compare the date to the pivot date for that site, and assign group based on that result;
data for_sort;
  set have;
  group = ifn(date lt input(site,site_datei.),1,2);
run;

现在您可以做很多事情来获得每组的最大值 - 这是一个 SQL 解决方案,因为您似乎更喜欢它。

proc sql;
  select id, site, group, max(date) format=date9. from for_sort group by id, site, group;
quit;

这可以在单个 SQL 查询中完成,但我建议不要这样做,除非有重大的性能考虑(在这种情况下,我什至更强烈建议不要 SQL!)。