SQL-server – den letzten Wert nach dem Ersetzen verwenden

Ich habe einen Tisch, der so aussieht:

  • Ich würde
  • create_date (gespeichert als dateTime)
  • Industrie

Beispieleinträge:

1, '2012-12-01 00:00:00', 'retail' 1, '1969-12-31 19:00:00', 'leisure and tourism' 1, '2010-10-01 00:00:00', 'telesales' 2, '2010-2-01 00:00:00', 'finance' 2, '2010-2-01 00:00:00', 'retail' 2, '2009-08-01 00:00:00', 'finance' 

Jetzt ist das Erstellungsdatum das aktuellste, wenn das Erstellungsdatum '1969-12-31' ist ODER wenn das nicht existiert, dann ist es das letzte date. Daher ändere ich irgendwelche data '1969-12-31' bis heute.

Doch jetzt möchte ich nur den aktuellen dateswert betrachten.

Dies scheint ein schwierigeres Problem, denn man muss mit der Umwandlung umgehen sowie die Reihenfolge nach der Umstellung, um dann den ersten Rang zu wählen. Auch einige Leute, die Sie nicht einmal brauchen, um ihre jüngsten date zu konvertieren, wie 2.

Ich möchte, dass die data wie folgt aussehen:

 1, '1969-12-31 19:00:00', ['leisure and tourism'] 2, '2010-2-01 00:00:00', ['finance', 'retail'] 

Ich habe hier Beispiele gefunden , aber es geht nicht um die dataumwandlung. Auch ein anderes Problem ist der Fall, wenn eine einzelne ID, hat zwei identische neuesten create_date's, wie mit id = 2 gezeigt, wo wir die Ergebnisse verketten müssen.

Ich habe auch versucht, eine Fall-statement zu erstellen, um bei der Konvertierung zu unterstützen:

 CASE WHEN create_date = '1969-12-31 19:00:00' THEN CONVERT(VARCHAR(19), GETDATE(),120) ELSE create_date --Format: yyyy-mm-dd hh:mi:ss END AS createDate 

Bitte beachten Sie, ich verwende SQL server.

 declare @t table(id int, create_date datetime, industry varchar(50)) insert @t values(1,'20121201', 'retail') insert @t values(1,'19691231', 'leisure and tourism') insert @t values(1,'20101001', 'telesales') insert @t values(2,'20100201', 'finance') insert @t values(2,'20100201', 'retail') insert @t values(2,'20090801', 'finance') ;with a as ( select id, industry, case when create_date = convert(datetime, '31/12/1969', 104) then current_timestamp else create_date end create_date, min(create_date) over (partition by id) chk, row_number() over (partition by id order by case when create_date = convert(datetime, '31/12/1969', 104) then 1 else 2 end, create_date desc) rn from @t ), b as ( select * from a where rn = 1 or chk <> convert(datetime, '31/12/1969', 104) ) select b.id, max(create_date) create_date ,STUFF(( select distinct ',' + industry from b b1 where b1.id = b.id for xml path(''), type ).value('.', 'varchar(max)'), 1, 1, '') [industries] from b group by b.id id create_date industries 1 2014-01-21 16:36:41.010 leisure and tourism 2 2010-02-01 00:00:00.000 finance,retail