在过滤后仅选择 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;
我正在使用双胞胎数据集,并想为双胞胎创建一个 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;