gpt4 book ai didi

indexing - 从 SAS 索引快速检索最后一行

转载 作者:行者123 更新时间:2023-12-04 20:07:51 25 4
gpt4 key购买 nike

我有一个非常大的表,其中包含一个 ID 字段和一个日期时间字段。该表按 ID 字段排序,按日期时间字段排序。

我想快速找到最大日期时间值,但我找不到任何好的方法来做到这一点。

样本数据:

data x;
do id=1 to 10000000;
created_datetime = datetime() + (ranuni(1)*100000);
output;
end;
format created_datetime datetime22.;
run;

proc sql noprint;
create index created_datetime on x;
quit;

尝试 #1:PROC SQLmax()功能

出于某种原因,我认为这会立即返回结果,但我发现实际发生的事情是违反直觉的(至少对我而言)。使用 max()函数不使用索引 - 它不能! Where 子句等可以使用索引,但 max() 函数不能。即使您强制使用索引,它仍然会处理表中的所有行,只是按照使用索引返回它们的顺序。
option msglevel=i;
proc sql noprint;
select max(created_datetime) from x(idxname=x);
quit;

尝试 #2:按组处理

下面使用索引轻松返回第一行:
data min; 
set x;
by created_datetime;
output;
stop;
run;

但我不能使用降序关键字向后遍历列表以获取最后一行:
data min; 
set x;
by descending created_datetime;
output;
stop;
run;

SAS 似乎也不支持降序索引,所以我也不能使用这种方法。

尝试 #3:使用有关索引的元数据和 WHERE声明

我看了 SASHELP.VINDEX希望最大值可以存储在元数据中的某个地方,然后我可以在 where 语句中使用。没有运气。

编辑:

尝试 #4:PROC SQLinobsoutobs

@DomPazz 的以下答案启发我重新审视其他一些基于 SQL 的解决方案。我想也许是 order by声明于 PROC SQL可能与 inobs 或 outobs 选项交互以实现我的目标。然而它并没有奏效。排序看起来像是应用于查询的输出,绝不会影响实际读取行的顺序。
/* Uncomment options as necessary */
proc sql noprint /*inobs=1 outobs=1*/;
create table temp as
select created_datetime
from x
order by created_datetime desc;
quit;

帮助!

最佳答案

这为您提供百分位数 - 最后一个应该是 100% 标记。这需要使用 UPDATECENTILES 重新创建索引。对数据进行任何添加/删除后的选项。

proc contents data=have centiles;
run;

如果您希望将其作为数据集(输出表名称为“INDEXES”),您可以使用 ODS OUTPUT 获取它:
ods output indexes=temp;
proc contents data=have centiles ;
run;

参见 Michael Raitel 的论文,特别是 The Basics Of Using SAS Indexes , 更多细节。

关于indexing - 从 SAS 索引快速检索最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23252670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com