Извините, я не мог объяснить это лучше в названии.Вот, по сути, то, что мне нужно сделать:
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
То, что я хочу взять, это всего лишь bench_id
123 для 1/31, так как это самая последняя скамья для entity_id = 1
и bench_id
125 для 12/30 и т. д. Итак, набор результатов:
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.
:)