sql - Get top 1 row of each group -


i have table want latest entry each group. here's table:

documentstatuslogs table

|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   | 

the table grouped documentid , sorted datecreated in descending order. each documentid, want latest status.

my preferred output:

| documentid | status | datecreated | | 1          | s1     | 8/02/2011   | | 2          | s3     | 8/01/2011   | | 3          | s1     | 8/02/2011   | 
  • is there aggregate function top each group? see pseudo-code getonlythetop below:

    select documentid, getonlythetop(status), getonlythetop(datecreated) documentstatuslogs group documentid order datecreated desc

  • if such function doesn't exist, there way can achieve output want?

  • or @ first place, caused unnormalized database? i'm thinking, since i'm looking 1 row, should status located in parent table?

please see parent table more information:

current documents table

| documentid | title  | content  | datecreated | | 1          | titlea | ...      | ...         | | 2          | titleb | ...      | ...         | | 3          | titlec | ...      | ...         | 

should parent table can access status?

| documentid | title  | content  | datecreated | currentstatus | | 1          | titlea | ...      | ...         | s1            | | 2          | titleb | ...      | ...         | s3            | | 3          | titlec | ...      | ...         | s1            | 

update learned how use "apply" makes easier address such problems.

;with cte (    select *,          row_number() on (partition documentid order datecreated desc) rn    documentstatuslogs ) select * cte rn = 1 

if expect 2 entries per day, arbitrarily pick one. both entries day, use dense_rank instead

as normalised or not, depends if want to:

  • maintain status in 2 places
  • preserve status history
  • ...

as stands, preserve status history. if want latest status in parent table (which denormalisation) you'd need trigger maintain "status" in parent. or drop status history table.


Comments

Popular posts from this blog

Change php variable from jquery value using ajax (same page) -

Pull out data related to my apps from Android Play Store and iOS App Store -

How can I fetch data from a web server in an android application? -