如何select以SAS中最接近Y的事物为起点
How to select within the closest thing to Y in SAS as a starting point
所以我有一个数据集,我想在其中 select 最接近点 X 的记录作为我的输出,
我有的是
PROC SQL ;
create table Check_vs_Excel2 as
SELECT PROPERTY, START_DATE, END_DATE, DAY_OF_WEEK, MARKET_CODE_PREFIX, RATE_PGM, ROOM_POOL, QUOTE_SERIES_NO, QUOTE_POSITION
FROM Sbtddraf.Vssmauditdraftfull
group by Property, RATE_PGM
having START_DATE = MAX(START_DATE);
quit;
我想取 START_DATE = Max(Start_DATE);并将其更改为(有效地)
START_DATE = 接近(今天())
非常感谢您的建议
'close to'有多近?这可能就是您要找的
where START_DATE between TODAY() and DATE_ADD(TODAY(),INTERVAL 30 DAY)
在 SQL 中,您的查询将使用相关子查询:
SELECT PROPERTY, START_DATE, END_DATE, DAY_OF_WEEK, MARKET_CODE_PREFIX, RATE_PGM, ROOM_POOL, QUOTE_SERIES_NO, QUOTE_POSITION
FROM Sbtddraf.Vssmauditdraftfull AS t
-- group by Property, RATE_PGM
WHERE START_DATE =
( select MAX(START_DATE)
FROM Sbtddraf.Vssmauditdraftfull AS t2
where t1.Property = t2.Property
and t1.RATE_PGM = t2.RATE_PGM
)
假设我知道你想要 start_date 和 today() 之间绝对差值最小的行(所以,MIN(ABS(START_DATE-TODAY()))
),你可以使用 having 子句做一个有点混乱的查询这样:
data have;
do id = 2 to 9;
do start_date = '02MAR2016'd to '31MAR2016'd by id;
output;
end;
end;
run;
proc sql;
select id, start_date format=date9.
from have
group by id
having abs(start_date-today()) = min(abs(start_date-today()));
quit;
我不喜欢这个部分是因为它是非标准的 SQL 并且给出了关于重新合并数据的注释(它是非标准的并且给你那个注释是因为你使用的值是在分组依据中实际上不可用),部分原因是如果两行并列,它会为您提供多行(如果您在 2016 年 3 月 16 日 运行 this,请参见 id=4)。
一个相关的子查询版本,它至少避免了重新合并注释(但实际上做了同样的事情):
proc sql;
select id, start_date format=date9.
from have H
where abs(start_date-today()) = (
select min(abs(start_date-today()))
from have V
where H.id=V.id
);
quit;
尽管 id=4 仍然给出两个(2016 年 3 月 16 日)。如果可能有两个答案(或者您可能想要严格少于?),您必须想出办法来选择。这会执行一个子查询以确定最小的差异是什么 returns 它。
所以我有一个数据集,我想在其中 select 最接近点 X 的记录作为我的输出,
我有的是
PROC SQL ;
create table Check_vs_Excel2 as
SELECT PROPERTY, START_DATE, END_DATE, DAY_OF_WEEK, MARKET_CODE_PREFIX, RATE_PGM, ROOM_POOL, QUOTE_SERIES_NO, QUOTE_POSITION
FROM Sbtddraf.Vssmauditdraftfull
group by Property, RATE_PGM
having START_DATE = MAX(START_DATE);
quit;
我想取 START_DATE = Max(Start_DATE);并将其更改为(有效地)
START_DATE = 接近(今天())
非常感谢您的建议
'close to'有多近?这可能就是您要找的
where START_DATE between TODAY() and DATE_ADD(TODAY(),INTERVAL 30 DAY)
在 SQL 中,您的查询将使用相关子查询:
SELECT PROPERTY, START_DATE, END_DATE, DAY_OF_WEEK, MARKET_CODE_PREFIX, RATE_PGM, ROOM_POOL, QUOTE_SERIES_NO, QUOTE_POSITION
FROM Sbtddraf.Vssmauditdraftfull AS t
-- group by Property, RATE_PGM
WHERE START_DATE =
( select MAX(START_DATE)
FROM Sbtddraf.Vssmauditdraftfull AS t2
where t1.Property = t2.Property
and t1.RATE_PGM = t2.RATE_PGM
)
假设我知道你想要 start_date 和 today() 之间绝对差值最小的行(所以,MIN(ABS(START_DATE-TODAY()))
),你可以使用 having 子句做一个有点混乱的查询这样:
data have;
do id = 2 to 9;
do start_date = '02MAR2016'd to '31MAR2016'd by id;
output;
end;
end;
run;
proc sql;
select id, start_date format=date9.
from have
group by id
having abs(start_date-today()) = min(abs(start_date-today()));
quit;
我不喜欢这个部分是因为它是非标准的 SQL 并且给出了关于重新合并数据的注释(它是非标准的并且给你那个注释是因为你使用的值是在分组依据中实际上不可用),部分原因是如果两行并列,它会为您提供多行(如果您在 2016 年 3 月 16 日 运行 this,请参见 id=4)。
一个相关的子查询版本,它至少避免了重新合并注释(但实际上做了同样的事情):
proc sql;
select id, start_date format=date9.
from have H
where abs(start_date-today()) = (
select min(abs(start_date-today()))
from have V
where H.id=V.id
);
quit;
尽管 id=4 仍然给出两个(2016 年 3 月 16 日)。如果可能有两个答案(或者您可能想要严格少于?),您必须想出办法来选择。这会执行一个子查询以确定最小的差异是什么 returns 它。