问题描述
检查 3 个月内是否有数据直到最多 600 条记录,然后如果尚未达到 600 条记录,然后重复之前的 3 个月,最好的方法是什么?而且它是一个大表,因此查询整个事情可能需要几分钟时间或完全挂起 Oracle sql Developer。
ROWNUM 似乎在返回查询结果之前为整个表提供行号,因此这似乎花费了太长时间。我们目前的做法是明确输入一个时间段,我们猜测其中会有足够的记录,然后将行数限制为 600。这仅需要 5 秒,但需要不断更改。
我想对每一行执行 FOR 循环,但无法在查询本身之外存储结果数以检查是否已达到 600。
我也在考虑创建数据索引?但我对此知之甚少。有没有办法在抓取整个表格之前按日期对数据进行排序会更快?
谢谢
解决方法
检查3个月内是否有数据直到最多600条记录,如果还没有达到600条,则重复之前的3个月?
查找最新日期并过滤以仅允许在其 6 个月内的行,然后获取前 600 行:
SELECT *
FROM (
SELECT t.*,MAX(date_column) OVER () AS max_date_column
FROM table_name t
)
WHERE date_column > ADD_MONTHS( max_date_column,-6 )
ORDER BY date_column DESC
FETCH FIRST 600 ROWS ONLY;
如果最近3个月内有600个或更多,则它们将被退回;否则会将结果集延长到接下来的 3 个月期间。
如果您打算在超过两个 3 个月的期限内重复延期,那么只需使用:
SELECT *
FROM table_name
ORDER BY date_column DESC
FETCH FIRST 600 ROWS ONLY;
我也在考虑创建数据索引?但我对此知之甚少。有没有办法在抓取整个表格之前按日期对数据进行排序会更快?
是的,在日期列上创建索引通常会使表格过滤速度更快。