联盟所有查询 - 每组需要最新日期

时间:2017-02-23 02:46:37

标签: sql sql-server

我需要一些SQL帮助。

我有2个表(T1T2),使用T3

将其分为1个表(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

我用它来做到这一点:

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

现在我想向此联合添加一个查询,以获得最新的DateT,每Group,每IDPersSec

结果应该是这样的:

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. SELECT GROUPN,ID_Pers,MAX(DateT)为DateT,Sec FROM         (             SELECT DateT,GROUPN,ID_Pers,Sec FROM T1             UNION ALL             SELECT DateT,GROUPN,ID_Pers,Sec FROM T2         )T3 GROUP BY ID_Pers,GROUPN,Sec
  2. 我得到的结果: 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

    ID_Pers的结果为244.应该只显示244的一个结果。

    结果应该是 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

    每组只有一个结果和最新日期。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分: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

答案 3 :(得分: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)