Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Sélectionnez une colonne dans SQL et non dans Group By

Les colonnes du jeu de résultats d'un select requête avec group by la clause doit être :

  • une expression utilisée comme l'un des group by critères , ou ...
  • une fonction d'agrégation, ou ...
  • une valeur littérale

Ainsi, vous ne pouvez pas faire ce que vous voulez faire en une seule requête simple. La première chose à faire est d'énoncer clairement votre énoncé de problème, par exemple :

Donné

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 première chose à faire est d'identifier la date de création la plus récente pour chaque groupe :

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

Cela vous donne les critères de sélection dont vous avez besoin (1 ligne par groupe, avec 2 colonnes :group_id et la date de création highwater) pour remplir la 1ère partie de l'exigence (sélection de la ligne individuelle de chaque groupe. Cela doit être une table virtuelle dans votre select final requête :

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

Si la table n'est pas unique par date_created dans group_id (AK02), vous pouvez obtenir des lignes en double pour un groupe donné.