Tengo una tabla en la que quiero obtener la última entrada para cada grupo. Aquí está la tabla:
DocumentStatusLogs
Mesa
|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 |
La tabla se agrupará DocumentID
y ordenará por DateCreated
orden descendente. Para cada uno DocumentID
, quiero obtener el último estado.
Mi salida preferida:
| DocumentID | Status | DateCreated |
| 1 | S1 | 8/02/2011 |
| 2 | S3 | 8/01/2011 |
| 3 | S1 | 8/02/2011 |
¿Hay alguna función agregada para obtener solo la parte superior de cada grupo? Ver pseudocódigo a
GetOnlyTheTop
continuación:SELECT DocumentID, GetOnlyTheTop(Status), GetOnlyTheTop(DateCreated) FROM DocumentStatusLogs GROUP BY DocumentID ORDER BY DateCreated DESC
Si tal función no existe, ¿hay alguna forma de lograr el resultado que quiero?
- O, en primer lugar, ¿podría ser esto causado por una base de datos no normalizada? Estoy pensando, ya que lo que estoy buscando es solo una fila, ¿debería
status
estar también ubicado en la tabla principal?
Consulte la tabla principal para obtener más información:
Documents
Tabla actual
| DocumentID | Title | Content | DateCreated |
| 1 | TitleA | ... | ... |
| 2 | TitleB | ... | ... |
| 3 | TitleC | ... | ... |
¿La tabla principal debería ser así para poder acceder fácilmente a su estado?
| DocumentID | Title | Content | DateCreated | CurrentStatus |
| 1 | TitleA | ... | ... | s1 |
| 2 | TitleB | ... | ... | s3 |
| 3 | TitleC | ... | ... | s1 |
ACTUALIZACIÓN Acabo de aprender a usar "aplicar", lo que hace que sea más fácil abordar tales problemas.