2011-04-25 44 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並進行連接。)