2017-02-27 7 views
1

Ich habe die Daten auf diese Weise in meiner Tabelle und ich versuche, Daten wie folgt zu erhalten. Ich habe versucht, coalese zu verwenden, aber Probleme, Daten für die neuesten zu bekommen.Kombinieren Sie die neuesten Daten basierend auf IDs

Key    Hazards    DateTime 
170021   Safety    2016-01-25 
170021   Concerns   2016-01-25 
170021   Abuse    2016-01-25 
252098   Financial   2016-10-28 
250606   Environmental  2016-10-26 
359287   food,utilities  2016-08-08 
409153   climate control  2016-06-24 
671881   None    2016-05-24 

Answer: Safety,Concerns,Abuse 

Ergebnis Sollte wie oben sein. Was iam versucht zu tun ist, den Schlüssel basierend auf dem neuesten Wert von DateTime zu erhalten und wenn mehrere Datensätze für diesen Schlüssel verfügbar sind, verketten sie diese zu einer Zeichenkette und kehren zurück. Wenn nur ein einzelner Datensatz vorhanden ist, wird dieser Datensatz zurückgenommen.

+0

wir Ihnen helfen, Hilfe - bitte die Struktur der Tabelle und die Beispieldaten gemeinsam nutzen, die das Ergebnis produe sollten Sie versuchen zu bekommen. – Mureinik

+0

Und welche Version von SQL Server bitte? – gbn

+1

Suchst du so etwas? http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql-server-2005 –

Antwort

1

SQL Server 2016 können Sie STRING_AGG

SELECT STRING_AGG([Hazards], ',') 
FROM MyTable 
GROUP BY [Key] 
+0

Wie dieser Ansatz, aber wir sind nicht auf Sql 2016 so wird es nicht für uns arbeiten. – user3038399

+0

Ich habe dich kommentiert, um dich zu fragen .. – gbn

1

Ist das hilfreich für Sie verwenden?

;WITH testtable([Key],Hazards,[DateTime])AS(
    SELECT '170021','Safety',CONVERT(DATE,'2016-01-25') UNION all 
    SELECT '170021','Concerns','2016-01-25' UNION all 
    SELECT '170021','Abuse','2016-01-25' UNION ALL 
    SELECT '170021','Abuse','2016-01-24' UNION ALL 
    SELECT '170021','Abuse2','2016-01-23' UNION ALL 
    SELECT '170021','Abuse3','2016-01-22' UNION ALL 
    SELECT '170021','Abuse4','2016-01-21' UNION all 
    SELECT '252098','Financial','2016-10-28' UNION all 
    SELECT '250606','Environmental','2016-10-26' UNION all 
    SELECT '359287','food,utilities','2016-08-08' UNION all 
    SELECT '409153','climate control','2016-06-24' UNION all 
    SELECT '671881','None','2016-05-24' 
) 
SELECT DISTINCT t.[Key],t.DateTime,STUFF(c.Hazards,1,1,'') AS Hazards FROM (
    SELECT *,RANK()OVER(PARTITION BY [Key] ORDER BY DateTime DESC) AS rn FROM testtable 
) AS t 
CROSS APPLY(SELECT ','+tt.Hazards FROM testtable AS tt WHERE tt.[Key]=t.[Key] AND DATEDIFF(d,tt.DateTime,t.DateTime)=0 FOR XML PATH('')) AS c(Hazards) 
WHERE rn=1 
 
Key DateTime Hazards 
------ ---------- -------------- 
170021 2016-01-25 Safety,Concerns,Abuse 
250606 2016-10-26 Environmental 
252098 2016-10-28 Financial 
359287 2016-08-08 food,utilities 
409153 2016-06-24 climate control 
671881 2016-05-24 None 
0

Verwendung while-Schleife Verfahren gespeichert

Declare @date_1 char(10) 
Declare @cnt int=1 
Declare @aktual_cnt int 
Declare @Haz nvarchar(max)='' 
Declare @Haz_1 nvarchar(max)='' 

select * 
into test_table_1 
from test_table -- Enter your table name 

set @date_1=(select top 1 DateTime from test_table_1 
order by Datetime) 

SET @aktual_cnt=(select count(*) from test_table_1 where [email protected]_1) 

while (@cnt<[email protected]_cnt) 
begin 
if (@cnt=1) 
    begin 
    set @Haz_1=(select top 1 Hazards from test_table_1 where [email protected]_1) 
    set @Haz = @Haz_1 
    delete from test_table_1 where [email protected]_1 and [email protected]_1 
    end 
else 
    begin 
    set @Haz_1=(select top 1 Hazards from test_table_1 where [email protected]_1) 
    set @Haz = @Haz + ','[email protected]_1 
    delete from test_table_1 where [email protected]_1 and [email protected]_1 
    end 


SET @[email protected]+1 


end 
drop table test_table_1 
select @Haz 
Verwandte Themen