Mam tabelę, w której chcę uzyskać najnowszy wpis dla każdej grupy. Oto tabela:
DocumentStatusLogs
Stół
|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 |
Tabela zostanie pogrupowana DocumentID
i posortowana według DateCreated
malejącej kolejności. Dla każdego DocumentID
chcę uzyskać najnowszy status.
Moja preferowana wydajność:
| DocumentID | Status | DateCreated |
| 1 | S1 | 8/02/2011 |
| 2 | S3 | 8/01/2011 |
| 3 | S1 | 8/02/2011 |
Czy jest jakaś funkcja agregująca, która pozwala uzyskać tylko szczyt z każdej grupy? Zobacz pseudo-kod
GetOnlyTheTop
poniżej:SELECT DocumentID, GetOnlyTheTop(Status), GetOnlyTheTop(DateCreated) FROM DocumentStatusLogs GROUP BY DocumentID ORDER BY DateCreated DESC
Jeśli taka funkcja nie istnieje, czy jest jakiś sposób na osiągnięcie pożądanej wydajności?
- A może po pierwsze, może to być spowodowane nienormalizowaną bazą danych? Zastanawiam się, skoro szukam tylko jednego wiersza, czy powinien on
status
również znajdować się w tabeli nadrzędnej?
Więcej informacji znajduje się w tabeli nadrzędnej:
Aktualna Documents
tabela
| DocumentID | Title | Content | DateCreated |
| 1 | TitleA | ... | ... |
| 2 | TitleB | ... | ... |
| 3 | TitleC | ... | ... |
Czy tabela nadrzędna powinna być taka, aby móc łatwo uzyskać dostęp do jej statusu?
| DocumentID | Title | Content | DateCreated | CurrentStatus |
| 1 | TitleA | ... | ... | s1 |
| 2 | TitleB | ... | ... | s3 |
| 3 | TitleC | ... | ... | s1 |
AKTUALIZACJA Właśnie nauczyłem się używać „aplikuj”, co ułatwia rozwiązywanie takich problemów.