2009-09-03 2 views
4

У меня есть веб-приложение, которое позволяет клиенту определять ежедневную ставку за их обслуживание. В любой день клиент может ввести две ставки, почасовую ставку (rateTypeId = 1) и dailyRate (rateTypeId = 2). Эти ставки часто назначаются заранее, и они часто меняются. Мне нужно отслеживать все назначения, но только вытащить последнюю назначенную ставку.Mysql join на основе max (timestamp)

У меня есть две таблицы. Первая таблица просто определяет свою структуру ставок и выглядит следующим образом (упрощенный):

Таблица: RateDefinitions

RATECODE ----- RATE 
31 ---------------- 5.00 
32 ---------------- 6.00 
33 ---------------- 7.00 

Моя вторая таблица отслеживает ставки, назначенные указанными датами. На заданную дату может быть назначено более одной ставки, но мы будем использовать только самую последнюю ставку, основанную на «entrytimestamp».

Таблица: Цены

ID --- RATETYPEID --- RATECODE ------ DATE -------- ENTRYTIMESTAMP 
1 ---------- 1 --------------- 31 ---------- 20091010 ---------- 1100000000 
2 ---------- 2 --------------- 33 ---------- 20091010 ---------- 1100000000 
3 ---------- 1 --------------- 32 ---------- 20091010 ---------- 1200000000 

Теперь я с трудом поставив вместе запрос, который будет тянуть все последние задания скорости для данного периода времени.

Я пробовал:

select r.id, r.rateTypeId, r.rateCode, max(r.entryTimestamp), rd.rate 
from rates r 
join rateDefinitions rd 
on r.rateCode=rd.rateCode 
where date=20091010 
group by startDate, rateTypeId 

Но это не собирается делать это. Я думаю, что мне нужно присоединиться к команде subselect, но не уверен. Мои результаты должны содержать две строки на дату, похожие на:

ID --- RATETYPEID --- RATECODE ---------- ENTRYTIMESTAMP ----- RATE 
3 ----------- 1 --------------- 32 -------------------- 1200000000 ----------6.00 
2 ----------- 2 --------------- 33 -------------------- 1100000000 ----------7.00 

Спасибо за любые предложения.

ответ

2

Эта проблема довольно распространена. Вам нужен подзапрос, чтобы выбросить максимальную временную метку и ratetypeid (которая является основой для группировки), а затем выберите все остальное из внутреннего соединения этих строк подзапроса и всего остального.

Для MySQL:

SELECT ratecode, rate, id, ratetypeid, date, entrytimestamp 

FROM ratedefinitions, 
(SELECT ratetypeid, MAX(entrytimestamp) AS max_timestamp FROM Rates 
GROUP BY ratetypeid) AS inner_table 

WHERE 

inner_table.ratetypeid = ratetypeid 
AND innertable.max_timestamp = timestamp 
+0

Благодаря Кримсон и Дуг Хейс. Теории здесь помогли решить проблему. – user167850

0

Я рекомендую подзапрос:

select r.id, r.rateTypeId, r.rateCode, max(r.entryTimestamp), rd.rate 
from 
rateDefinitions rd, 
rate r, 
    (select 
     rateCode, max(entryTimestamp) maxEntryTimestamp 
    from 
     rate 
    where date=20091010 
    group by rateCode) latestRates 

where r.rateCode=rd.rateCode AND 
    r.rateCode = latestRates.rateCode AND 
    r.entryTimestamp = latestRates.maxEntryTimestamp 
group by startDate, rateTypeId 

Там большое предположение здесь с моей стороны. То есть в таблице скоростей, для заданной даты и кода скорости, уникальные записи являются уникальными.

Смежные вопросы