最早选择用户并加入其他数据
我有一个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
字段的选择,即我想id
和value
被选择用于的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
查询?这是否是正确的方法来获得我想要的?
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'
基于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
当您省略'ROWS' /'RANGE'子句时,它默认为'ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW'。 – Quassnoi 2009-11-18 18:48:16
你可以发布样本数据和期望的输出吗? – shahkalpesh 2009-11-18 18:52:10