在过滤后仅选择 SQL 中的最小值后包含变量?

Including variables after filtering selecting only minimum values in SQL?

我正在使用双胞胎数据集,并想为双胞胎创建一个 table,其中包含对象 ID (Subject) 和双胞胎对 ID (twpair)值相等)一生吸食大麻的总数 (MJ1a)。

我的 table 的一部分看起来像这样:

Subject twpair MJ1a
156 345 10
157 345 7
158 346 20
159 346 3
160 347 4
161 347 4

我希望创建一个 table 只有大麻使用量较少的双胞胎,看起来像这样:

Subject twpair MJ1a
157 345 7
159 346 3
161 347 4

这是我目前的 SQL 代码:

proc sql; 
create table one_twin as 
select twpair,min(MJ1a) as minUse, Subject 
from twins_deviation
group by twpair; 

不幸的是,这最终导致所有主题重新合并回数据集中。如果我不包括主题部分,我会得到正确的 twpair 和 MJ1a 值,但不是主题 ID。

如何过滤数据集以仅包含具有最小值的数据集,同时还包含感兴趣的变量(如主题 ID)?请注意,如果两对双胞胎具有相同的值,我想 select 一对,但我 select 并不重要。任何提示将不胜感激!

这个查询应该会给你想要的结果。

select a.subject,a.twpair,a.MJ1a from twins_deviation a join (select twpair,min(mj1a) as mj1a from twins_deviation group by twpair)b on a.twpair=b.twpair and a.mj1a=b.mj1a

如果您的数据库支持 analytic/window 函数,同样可以使用排名函数来完成,解决方案如下。

EDIT1:处理 mj1a 的相同值

select subject,twpair,mj1a from(select subject,twpair,mj1a ,row_number() over(partition by twpair order by mj1a) as rnk from twins_deviation)out1 where rnk=1;

EDIT2:更新解决方案 1 以仅包含一个双胞胎。

select min(subject) as subject,twpair,mj1a from(select a.subject as subject ,a.twpair as twpair,a.MJ1a as MJ1a from twins_deviation a join (select twpair,min(mj1a) as mj1a from twins_deviation group by twpair)b on a.twpair=b.twpair and a.mj1a=b.mj1a)out1 group by twpair,MJ1a;