Sql 选择子查询中日期最早的值

Sql 选择子查询中日期最早的值,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我想从日期最早的子查询返回一个值 表 id sub bid 1 1 1 1 2 2 1 3 1 1 4 1 2 1 2 2 2 1 表B id value date 1 red 01/01/2016 1 blue 05/01/2016 2 red 07/01/2016 2 green 03/01/2016 2 yellow 08/01/2016 预期产量 id sub value 1 1

我想从日期最早的子查询返回一个值

id  sub  bid
1   1    1
1   2    2
1   3    1
1   4    1
2   1    2
2   2    1
表B

id value  date
1  red    01/01/2016
1  blue   05/01/2016
2  red    07/01/2016
2  green  03/01/2016
2  yellow 08/01/2016
预期产量

id  sub  value
1   1    red
1   2    green
1   3    red
1   4    red
2   1    green
2   2    red
现行代码

SELECT a.id, 
       a.sub,
       (SELECT b.value FROM tableb b WHERE b.date = MIN(b.date)) AS value
FROM tablea a
INNER JOIN tableb b ON a.bid = b.id
尝试使用不存在的:

SELECT t.id,t.sub,s.value
FROM TableA t INNER JOIN TableB s ON(t.bid = s.id)
WHERE NOT EXISTS(SELECT 1 FROM tableB f
                 WHERE f.id = s.id and f.date < s.date)
这基本上就是加入,然后过滤所有日期大于当前值的人,使您保留所有最新日期。

尝试使用“不存在”:

SELECT t.id,t.sub,s.value
FROM TableA t INNER JOIN TableB s ON(t.bid = s.id)
WHERE NOT EXISTS(SELECT 1 FROM tableB f
                 WHERE f.id = s.id and f.date < s.date)

这基本上是进行连接,然后过滤所有日期大于当前值的人,使您保留所有最新日期。

假设您希望每个id的最小日期:


假设您需要每个id的最小值:


没有得到任何错误,但它已经运行了15分钟了,这是一个有效的方法来处理大量的数据吗?你必须有大量的数据。索引会有帮助:比如tablebid,date。虽然没有出现任何错误,但它已经运行了15分钟,这是一种有效的方法吗?你必须有很多数据。索引会有帮助:例如tablebid、date。