最早选择用户并加入其他数据

问题描述:

我有一个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

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