0
我有一个名为“level”的列的数据库,它存储从1开始增加的整数。在SQL中设置范围边界
我想运行一个select语句(它也会有各种其他条件)来检索每个“级别”的第一个和最后一个行,即每个级别的边界。但是我有数千万条记录,所以希望以最有效的方式做到这一点。
有什么建议吗?
我有一个名为“level”的列的数据库,它存储从1开始增加的整数。在SQL中设置范围边界
我想运行一个select语句(它也会有各种其他条件)来检索每个“级别”的第一个和最后一个行,即每个级别的边界。但是我有数千万条记录,所以希望以最有效的方式做到这一点。
有什么建议吗?
我会调用决定第一个和最后一个something
的变量。我想这是一个时间戳,但你没有告诉我们。
如果从该行需要一列,然后
SELECT level, MAX(something) as maxie, MIN(something) as minnie
FROM mytable
GROUP BY level;
如果你想整行,请务必使用一个数据库窗口函数
SELECT DISTINCT first_value(mytable) over www, last_value(mytable) over www
FROM mytable
WINDOW www as (partition by level order by level, something
RANGE BETWEEN unbounded preceding AND unbounded following);
如果这些都太缓慢,有可能基于level
和something
的巧妙索引的一些噱头。我仍然在学习窗口化,这对Postgres 9来说是新的,但在Oracle中已经有好几年了。 (这不是在MySQL中;你可能需要获得极值的PK并进行连接。)
如何确定每个级别的哪些行是“第一”和“最后”? – 2011-04-25 02:23:12
这个问题在SO中多次提出 - 你应该首先进行搜索。通常,您需要指定如何确定顺序(即第一个和最后一个)以及如何处理重复项。 – 2011-04-25 05:34:26