2017-02-23 8 views
0

私はSQLでいくつかの助けが必要です。ユニオンすべてのクエリ - グループごとに最新の日付が必要

私は、2つのテーブル(T1T2)を得た私はそれを行うには、これを使用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 

を使用して1台(T3)にそれを作った:

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 

は今、私がしたいですこのユニオンにすべてのクエリを追加して、最新のDateTGroupIDPersSec

結果は次のようにする必要があります:

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 

任意の提案ですか?

私が使用している場合、まだ、働いていないこんにちは、 :

  1. T1 UNION FROM ( SELECT DateT、groupnは、ID_Pers、秒〜DateT、秒としてSELECT groupnは、ID_Pers、MAX(DateT) GROUP ID_PERS DateT秒:ALL SELECT DateT、groupnは、ID_Pers、T2 FROM秒)T3のGROUP BY ID_Pers、groupnは、秒

は私が結果を得ます10 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

のみ秒
840 122 2016年10月24日13:05 GROUP ID_PERS DateTあるべき244

結果に対して1件の結果を示すべきである244 ID_Persダブル結果: 33 7.75 840 156 2016/10/25 8:38:59 7 840 244 2016/10/25 9:39:22 6.7

結果fまたは各グループと最新の日付。

+2

'メートルの選択を助けるかもしれないと思いますax(DateT)、GROUP、ID_Pers、Sec ......グループ別、グループ別、ID_Pers、Sec' – artm

+1

@artm回答は短くて甘いので他のものよりも良い – Edward

+0

@Edward、答えがうまくいかない問題がある – Frankie

答えて

0

以下のクエリを参照できます。あなたの期待どおりの結果を返します。

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

こんにちは、これはMINなしで可能ですか? – Frankie

+0

@フランキー:それは不可能です。 2つのフィールドID_PersとGROUPでグループ化したいからです。 MAXまたはAVG(秒)を使用するか、必要でない場合はこのフィールドを削除してください。 – Tomato32

+0

Min(sec)なしでこれを行う方法を教えてください。原因Min(sec)が結果に影響します。 – Frankie

0

代わりのGROUP BY、私はあなたが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

これを私のユニオンのすべてのクエリと組み合わせて使用​​するにはどうすればいいですか? SELECT GROUPN、ID_Pers、MAX(DateT)DateT、秒FROM(SELECT DateT、GROUPN、ID_Pers、T1 UNION ALL SELECT日付、GROUPN、ID_Pers、T2からの秒)T3 GROUP BY ID_Pers、GROUPN、Sec – Frankie

0

enter image description here私はそれはあなた

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

のみ使用できます新しいテーブルを作成することはできません。何か案は? – Frankie

+0

成果は次のようになります244 \t 2016年10月25日9時39分22秒\t 6.7 2016年10月25日8時38分59秒 2016年10月24日午後1時05分33秒\t 7.75 – Frankie

+0

; ID_Pers、 AS cteTotalSales(Datet、GROUPx、ID_Pers、SEC) WITH( T1 組合からDatet、GROUPx、ID_Pers、秒を選択T2 からDatet、GROUPx、ID_Pers、秒を選択 )Datet、GROUPxを選択 、SecからcteTotalSales Datet in(GROUPx(ID_Pers)によるcteTotalSalesグループからの最大(Datet)の選択)、Datet desc –

関連する問題