Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Seleziona una colonna in SQL non in Raggruppa per

Le colonne nel set di risultati di una select interrogare con group by la clausola deve essere:

  • un'espressione usata come uno dei group by criteri , o ...
  • una funzione aggregata o ...
  • un valore letterale

Quindi, non puoi fare quello che vuoi fare in una singola, semplice query. La prima cosa da fare è dichiarare la tua dichiarazione del problema in modo chiaro, qualcosa del tipo:

Dato

create table dbo.some_claims_table
(
  claim_id     int      not null ,
  group_id     int      not null ,
  date_created datetime not null ,

  constraint some_table_PK primary key ( claim_id                ) ,
  constraint some_table_AK01 unique    ( group_id , claim_id     ) ,
  constraint some_Table_AK02 unique    ( group_id , date_created ) ,

)

La prima cosa da fare è identificare la data di creazione più recente per ciascun gruppo:

select group_id ,
       date_created = max( date_created )
from dbo.claims_table
group by group_id

Questo ti dà i criteri di selezione di cui hai bisogno (1 riga per gruppo, con 2 colonne:group_id e data di creazione highwater) per soddisfare la prima parte del requisito (selezionando la singola riga da ciascun gruppo. Deve essere una tabella virtuale in la tua select finale domanda:

select *
from dbo.claims_table t
join ( select group_id ,
       date_created = max( date_created )
       from dbo.claims_table
       group by group_id
      ) x on x.group_id     = t.group_id
         and x.date_created = t.date_created

Se la tabella non è univoca per date_created all'interno di group_id (AK02), puoi ottenere righe duplicate per un determinato gruppo.