抱歉,我无法在标题中更好地解释这一点。这基本上是我需要完成的任务:
Entity table: entity_id
BenchHistory table: entity_id, bench_id, bench_effective_date
Summary table: entity_id, effective_date
简而言之,这就是数据库布局。此查询从
effective_date
表中查找每个实体的 Summary
。它还需要查找该特定日期的 bench_id
,方法是查看 BenchHistory
表并找到小于 bench_effective_date
的最大 effective_date
,其中 BenchHistory.entity_id = Entity.entity_id
。
这是我所拥有的:
SELECT
Entity.entity_id
Summary.effective_date
BenchHistory.bench_id
FROM
Entity
JOIN Summary ON Entity.entity_id = Summary.entity_id
JOIN BenchHistory ON Entity.entity_id = BenchHistory.entity_id
很简单,长凳部分是我遇到问题的地方。如何仅选择一个
BenchHistory.bench_id
,它必须是相对于 Summary.effective_date
最新的?
为了清楚起见,每个实体都有许多对应的
effective_dates
和许多对应的 bench_ids
,但一次只有一个 bench_id
可以“有效”(最近的一个)。我试图根据该行的 bench_id
找到每一行的“有效”effective_date
。我需要通过确定哪个 bench_id
的 bench_effective_date
小于 effective_date
来做到这一点。
这是我的一个查询示例,也许这样会更容易可视化。
SELECT
Entity.entity_id
BenchHistory.bench_id
Summary.effective_date
BenchHistory.bench_effective_date
FROM
Entity
JOIN Summary ON Entity.entity_id = Summary.entity_id
JOIN BenchHistory ON Entity.entity_id = BenchHistory.entity_id
这将给出如下输出:
entity_id bench_id effective_date bench_effective_date
1 120 1/31/2011 6/30/2003
1 121 1/31/2011 3/22/2005
1 122 1/31/2011 11/03/2008
1 123 1/31/2011 1/21/2011
1 124 12/30/2010 5/15/2010
1 125 12/30/2010 10/06/2010
我想要抓取的只是 1/31 的
bench_id
123,因为它是 entity_id = 1
的最新板凳和 12/30 的 bench_id
125 等。所以结果集:
entity_id bench_id effective_date bench_effective_date
1 123 1/31/2011 1/21/2011
1 125 12/30/2010 10/06/2010
谢谢,抱歉,如果这是一个简单的问题,但我已经花了 6 个小时来尝试各种子查询、聚合、GROUP BY 等。我对 SQL 不太有经验。
:)
这不是一个简单的问题,也花了我很多时间。基本上与 Mysql - Need to getlate of table A when referenced from table B 相同的问题,并且与 mysql 功能请求相关 http://bugs.mysql.com/bug.php?id=2020 ,请参阅获取信息。
也许对您来说最简单的是遵循这个示例:
假设您有每个商店每种商品的价格表。对于每种商品,您希望查看最低价格和相关商店,您可以在其中以该价格购买该商品!与您的示例完全相同 - 您想要一条具有最大修订版本的记录。
create table prices ( goods varchar(10), price double, store varchar(10) );
insert into prices values ('car', 200, 'Amazon'), ('car', 150, 'CarStore'), ('Bread', 2, 'Baker1'), ('Bread', 1, 'Baker2');
select goods, min(price),
(select store
from prices as p
where p.goods = prices.goods
order by price limit 1) as store
from prices
group by goods;
因此您只想
JOIN
最大日期小于摘要的工作台表
SELECT
Entity.entity_id
,BenchHistory.bench_id
,Summary.effective_date
,BenchHistory.bench_effective_date
FROM
Entity
JOIN Summary
ON Summary.entity_id = Entity.entity_id
JOIN BenchHistory
ON BenchHistory.bench_id IN
(
SELECT TOP 1
z.bench_id
FROM
BenchHistory z
WHERE
z.entity_id = Summary.entity_id
AND z.bench_effective_date <= Summary.effective_date
ORDER BY
z.bench_effective_date DESC
)
另一方面,如果您想完全排除任何日期大于 effective_date 的替补席,您可以使用
HAVING
子句,如果是这种情况,请告知....