2017-02-23 1 views
0

Ich brauche etwas Hilfe mit SQL.Union alle Abfrage - brauchen das neueste Datum pro Gruppe

bekam ich 2 Tabellen (T1 und T2), machte es in 1 Tisch (T3) von union all

T1 
DateT    GROUP ID_Pers Sec 
2016/10/24 13:05:33 840 122  7.75 
2016/10/24 11:10:29 840 244  8.4 

T2 
DateT    GROUP ID_Pers Sec 
2016/10/24 12:10:37 840 122  7.75 
2016/10/25 08:38:59 840 156  7 
2016/10/25 09:39:22 840 244  6.7 

T3 
DateT    GROUP ID_Pers Sec 
2016/10/24 13:05:33 840 122  7.75 
2016/10/24 11:10:29 840 244  8.4 
2016/10/24 12:10:37 840 122  7.75 
2016/10/25 08:38:59 840 156  7 
2016/10/25 09:39:22 840 244  6.7 

mit benutze ich dies zu tun:

SELECT DateT,GROUP, ID_Pers,Sec 
FROM 
    (
     SELECT DateT,GROUP, ID_Pers,Sec FROM T1 
     UNION ALL 
     SELECT DateT,GROUP, ID_Pers,Sec FROM T2 
    ) T3 
GROUP BY ID 

Jetzt möchte ich fügen Sie alle eine Abfrage zu dieser Vereinigung die neuesten DateT zu bekommen, pro Group, pro IDPers, Sec

Ergebnis sollte wie folgt sein:

DateT    GROUP ID_Pers Sec 
2016/10/24 13:05:33 840 122  7.75 
2016/10/25 09:39:22 840 244  6.7 
2016/10/25 08:38:59 840 156  7 

Irgendwelche Vorschläge?

Hallo, immer noch nicht funktioniert, wenn ich benutze:

  1. SELECT groupN, ID_Pers, MAX (DateT) als DateT, Sec FROM ( SELECT DateT, groupN, ID_Pers, Sec FROM T1 UNION ALLE SELECT DateT, groupN, ID_Pers, Sec VON T2 ) T3 GROUP BY ID_Pers, groupN, Sec

ich Ergebnis: GROUP ID_PERS DateT Sec
840 122 2016/10/24 13:05:33 7.75 840 156 2016/10/25 8:38:59 7 840 244 2016/10/25 9:39:22 6.7 840 244 2016/10/24 11:10:29 8,4

Doppelergebnis für ID_Pers 244. nur für ein Ergebnis zeigen sollte 244.

Ergebnis GROUP ID_PERS DateT Sec
840 122 2016/10/24 13:05 sein sollte: 33 7.75 840 156 2016/10/25 8:38:59 7 840 244 2016/10/25 9:39:22 6.7

Nur ein Ergebnis f oder jede Gruppe und das letzte Datum.

+2

SELECT m Axt (DateT), GROUP, ID_Pers, Sec ......Gruppe von GROUP, ID_Pers, Sec' – artm

+1

@ArtM als Antwort, besser als die anderen, wie es kurz und süß ist – Edward

+0

@Edward, Antwort funktioniert nicht immer noch mit Problem – Frankie

Antwort

0

Sie können diese Abfrage unten beziehen. Es wird das Ergebnis wie erwartet zurückgeben.

SELECT GROUP, ID_Pers, MAX(DateT) as DateT, MIN(Sec) as Sec 
FROM 
     (
      SELECT DateT,GROUP, ID_Pers,Sec FROM T1 
      UNION ALL 
      SELECT DateT,GROUP, ID_Pers,Sec FROM T2 
     ) T3 
GROUP BY ID_Pers, GROUP 
+0

Hallo, ist das ohne MIN (SEC) möglich? – Frankie

+0

@Frankie: Es ist unmöglich. Weil Sie die Gruppe mit 2 Feldern ID_Pers und GROUP gruppieren möchten. Sie können MAX oder AVG (Sec) verwenden oder dieses Feld entfernen, wenn es nicht notwendig ist, mein Freund. – Tomato32

+0

können Sie mir sagen, wie Sie dies ohne Min (sec) tun, weil Min (sec) das Ergebnis beeinflussen wird. – Frankie

0

Statt GROUP BY, ich glaube, Sie wollen ROW_NUMBER():

SELECT DateT, GROUP, ID_Pers, Sec 
FROM (SELECT DateT, GROUP, ID_Pers, Sec, 
      ROW_NUMBER() OVER (PARTITION BY GROUP, ID_Person ORDER BY DateT DESC) as seqnum 
     FROM ((SELECT DateT,GROUP, ID_Pers,Sec FROM T1 
      ) UNION ALL 
      (SELECT DateT,GROUP, ID_Pers,Sec FROM T2 
      ) 
      ) T3 
    ) T3 
WHERE seqnum = 1; 
0
;WITH cteDate(DateT, GROUP, ID_Pers,Sec) 
AS 
(
SELECT DateT,GROUP, ID_Pers,Sec FROM T1 
UNION ALL 
SELECT DateT,GROUP, ID_Pers,Sec FROM T2 
) 

SELECT * 
FROM cteDate x 
    INNER JOIN (
       SELECT MAX(DateT) MaxDateT,GROUP, ID_Pers 
       FROM cteDate 
       GROUP BY GROUP, ID_Pers 
       ) temp 
     ON temp.MaxDateT = x.DateT AND temp.GROUP = x.GROUP AND temp.ID_Pers = x.ID_Pers 
+0

Wie benutze ich das in Kombination mit meiner union all query? SELECT GROUPN, ID_Pers, MAX (DateT) als DateT, Sec FROM (SELECT DatumT, GROUPN, ID_Pers, Sec FROM T1 UNION ALL SELECT DatumT, GROUPN, ID_Pers, Sec FROM T2) T3 GROUP BY ID_Pers, GROUPN, Sec – Frankie

0

enter image description here ich denke, es Ihnen helfen kann

enter image description here

;WITH 
    cteTotalSales (Datet,GROUPx,ID_Pers,Sec) 
    AS 
    (
select Datet,GROUPx,ID_Pers,Sec from t1 
union 
select Datet,GROUPx,ID_Pers,Sec from t2 
) 
select Datet,GROUPx,ID_Pers,Sec from cteTotalSales 
where Datet in (select max(Datet) from cteTotalSales group by GROUPx,ID_Pers) 
+0

Kann nur verwendet werden Union, kann keine neue Tabelle erstellen. Irgendwelche Ideen? – Frankie

+0

Ergebnis sollte sein: 244 \t 2016/10/25 9:39:22 \t 6,7 2016/10/25 8:38:59 2016/10/24 13:05:33 \t 7,75 – Frankie

+0

; MIT cteTotalSales (Tagt, GROUPx, ID_Pers, Sec) AS ( Tagt, GROUPx, ID_Pers wählen, von Sec t1 Vereinigung wählen Tagt, GROUPx, ID_Pers, Sec von t2 ) Tagt, GROUPx, ID_Pers wählen , Sec von cteTotalSales wo Datum in (wählen Sie max (Date) aus cteTotalSales-Gruppe von GROUPx, ID_Pers) sortieren nach Datum desc –