2011-04-25 100 views
0

我有一个名为“level”的列的数据库,它存储从1开始增加的整数。在SQL中设置范围边界

我想运行一个select语句(它也会有各种其他条件)来检索每个“级别”的第一个和最后一个行,即每个级别的边界。但是我有数千万条记录,所以希望以最有效的方式做到这一点。

有什么建议吗?

+1

如何确定每个级别的哪些行是“第一”和“最后”? – 2011-04-25 02:23:12

+0

这个问题在SO中多次提出 - 你应该首先进行搜索。通常,您需要指定如何确定顺序(即第一个和最后一个)以及如何处理重复项。 – 2011-04-25 05:34:26

回答

0

我会调用决定第一个和最后一个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); 

如果这些都太缓慢,有可能基于levelsomething的巧妙索引的一些噱头。我仍然在学习窗口化,这对Postgres 9来说是新的,但在Oracle中已经有好几年了。 (这不是在MySQL中;你可能需要获得极值的PK并进行连接。)