У меня есть таблица, в которой я хочу получить последнюю запись для каждой группы. Вот таблица:
DocumentStatusLogs
Таблица
|ID| DocumentID | Status | DateCreated |
| 2| 1 | S1 | 7/29/2011 |
| 3| 1 | S2 | 7/30/2011 |
| 6| 1 | S1 | 8/02/2011 |
| 1| 2 | S1 | 7/28/2011 |
| 4| 2 | S2 | 7/30/2011 |
| 5| 2 | S3 | 8/01/2011 |
| 6| 3 | S1 | 8/02/2011 |
Таблица будет сгруппирована DocumentID
и отсортирована по DateCreated
убыванию. Для каждого DocumentID
я хочу получить последний статус.
Мой предпочтительный вывод:
| DocumentID | Status | DateCreated |
| 1 | S1 | 8/02/2011 |
| 2 | S3 | 8/01/2011 |
| 3 | S1 | 8/02/2011 |
Есть ли какие-либо агрегатные функции, чтобы получить только верх из каждой группы? Смотрите псевдокод
GetOnlyTheTop
ниже:SELECT DocumentID, GetOnlyTheTop(Status), GetOnlyTheTop(DateCreated) FROM DocumentStatusLogs GROUP BY DocumentID ORDER BY DateCreated DESC
Если такой функции не существует, могу ли я получить желаемый результат?
- Или, во-первых, это может быть вызвано ненормализованной базой данных? Я думаю, поскольку то, что я ищу, это всего лишь одна строка, должна ли она
status
быть также расположена в родительской таблице?
Пожалуйста, смотрите родительскую таблицу для получения дополнительной информации:
Текущая Documents
таблица
| DocumentID | Title | Content | DateCreated |
| 1 | TitleA | ... | ... |
| 2 | TitleB | ... | ... |
| 3 | TitleC | ... | ... |
Должна ли родительская таблица быть такой, чтобы я мог легко получить доступ к ее состоянию?
| DocumentID | Title | Content | DateCreated | CurrentStatus |
| 1 | TitleA | ... | ... | s1 |
| 2 | TitleB | ... | ... | s3 |
| 3 | TitleC | ... | ... | s1 |
ОБНОВЛЕНИЕ Я только что узнал, как использовать «применить», что облегчает решение таких проблем.