Вопрос

Мне нужна помощь с запросом - я использую Firebird 2.1.

У меня есть столик, как:

RowID (primary key) | ActivityID | Duration | BilledAt

1 | 1 | 50 | 06.08.2010, 14:05:00.598
2 | 1 | 70 | 06.08.2010, 14:05:00.608
3 | 2 | 30 | 06.08.2010, 14:05:00.598
4 | 3 | 40 | 06.08.2010, 14:05:00.598
5 | 3 | 50 | 06.08.2010, 14:05:00.608

Я хотел бы получить продолжительность для каждой активности, но если есть более одной записи, доступных с той же активностью, мне нужна точка с наибольшим значением BillEDAT. (Самая последняя запись)

Если я выполню:

SELECT ActivityID, Max(BilledAt) 
FROM BilledTime 
GROUP BY ActivityID;

Я получу то, что хочу без ценностей продолжительности. Если я включил столбец продолжительности в группе по пункту, то выбраны несколько активных действий.

Есть ли элегантное решение этого?

Спасибо!

Это было полезно?

Решение

Не знаком с Firebird, поэтому синтаксис может быть неправильным, но это должно работать:

SELECT a.ActivityID, a.Duration, a.BilledAt
FROM BilledTime a
LEFT JOIN BilledTime b on a.ActivityID = b.ActivityID AND b.BilledAt > a.BilledAt
WHERE b.ActivityID IS NULL

В качестве альтернативы вы можете использовать более интуитивно понятную, где не существует подзапрос вместо левого присоединения, но я считаю, что вышеприведенное в конечном итоге будет быстрее.

Другие советы

Я бы понравился

SELECT a.ActivityID, a.Duration, a.BilledAt 
FROM BilledTime a 
WHERE a.BilledAt = (select max(b.billedAt) from BilledTime b where b.ActivityId = a.ActivityID)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top