Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wählen Sie eine Spalte in SQL aus, die nicht in Gruppieren nach ist

Die Spalten in der Ergebnismenge eines select Abfrage mit group by Klausel muss sein:

  • ein Ausdruck, der als einer der group by verwendet wird Kriterien , oder ...
  • eine Aggregatfunktion oder ...
  • ein Literalwert

Sie können also nicht mit einer einzigen, einfachen Abfrage tun, was Sie tun möchten. Das erste, was Sie tun müssen, ist, Ihre Problemstellung klar und deutlich zu formulieren, etwa so:

Gegeben

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

)

Als erstes müssen Sie das letzte Erstellungsdatum für jede Gruppe ermitteln:

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

Das gibt Ihnen die Auswahlkriterien, die Sie benötigen (1 Zeile pro Gruppe, mit 2 Spalten:group_id und das Highwater-Erstellungsdatum), um den 1. Teil der Anforderung zu erfüllen (Auswahl der einzelnen Zeile aus jeder Gruppe. Das muss eine virtuelle Tabelle sein). Ihre endgültige select Abfrage:

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

Wenn die Tabelle durch date_created nicht eindeutig ist innerhalb von group_id (AK02), können Sie doppelte Zeilen für eine bestimmte Gruppe erhalten.