2009-11-18 61 views
1

我有一個Oracle數據庫,我試圖從最早的行(基於time字段)中選擇一個user字段,其​​中滿足了某些條件,而且我沒有知道如何去做。這裏是我的查詢的要點:最早選擇用戶並加入其他數據

SELECT id, 
     CASE WHEN value = 'xyz' 
      THEN 'Pending' 
      ELSE 'Not Pending' 
     END AS status, 
     time 
FROM table1 
INNER JOIN ... 
WHERE subject IN (...) AND 
     field = 'Status' 

我的問題是我不知道如何選擇user與最早time值符合WHERE條件從該行獲得唯一的值。我不認爲我可以使用HAVING,因爲我沒有在SELECT中執行任何聚合函數。在「最早time值」條件需要僅適用user字段的選擇,即我想idvalue被選擇用於time字段的所有值。

我在想我可以保留上面的SELECT語句,然後用另一個SELECT語句JOIN,以獲得我想要的特定user

SELECT id, status, time, user 
FROM (
     ...query above... 
    ), 
    (
     SELECT user 
     FROM table1 
     WHERE subject in (...) AND 
      field = 'Status' AND 
      ROWNUM = 1 
     ORDER BY time ASC 
    ) 

然而,這僅僅得到了user一個整體價值,而且應該在我的第一個查詢選擇的每個id單獨user值。如何通過其他查詢的id字段限制我的SELECT user查詢?這是否是正確的方法來獲得我想要的?

+0

你可以發佈樣本數據和期望的輸出嗎? – shahkalpesh 2009-11-18 18:52:10

回答

1
SELECT id, 
     CASE WHEN value = 'xyz' 
      THEN 'Pending' 
      ELSE 'Not Pending' 
     END AS status, 
     time, 
     FIRST_VALUE(user) OVER (PARTITION BY id ORDER BY time) AS first_user 
FROM table1 
INNER JOIN 
     ... 
WHERE subject IN (...) AND 
     field = 'Status' 
+0

基於http://download.oracle.com/docs/cd/B13789_01/server.101/b10759/functions049.htm我認爲這正是我需要的。 :)我有一個有限的接口,通過它我可以訪問數據庫,並且查詢當前超時...我正在調查諸如'UNBOUNDED PRECEDING'和其他的選項http://download.oracle.com/docs/ cd/B13789_01/server.101/b10759/functions001.htm#i81407嘗試使其運行更快。 – 2009-11-18 18:35:30

+0

當您省略'ROWS' /'RANGE'子句時,它默認爲'ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW'。 – Quassnoi 2009-11-18 18:48:16