加入两个表,获得一个的Aggregate和唯一值

时间:2017-11-06 20:38:57

标签: sql-server

之前可能已经回答过,但我很难描述我的问题。

假设我有两张桌子

Table1 
User,  CalendarID 
Joe      1 
Joe      2 
Joe      3 
Sam      4
Bob      1 
Jim      2 
Jim      3

Table2
CalendarID,   CalendarTime
1             2014-08-18 00:00:00.000
2             2015-01-19 00:00:00.000
3             2015-08-24 00:00:00.000
4             2016-01-18 00:00:00.000

我想要做的是加入两个表,只获取一个用户名和日历ID,基于与该CalandarID关联的最高CalendarTime。

所以我希望查询返回

User   CalendarID
Joe    3
Sam    4
Bob    1
Jim    3

我最接近的是

SELECT t1.User, MAX(t2.CalendarTIme) AS CalendarTime
FROM table1 t1
INNER JOIN table2 as t2
ON t1.CalendarID = t2.CalendarID
Group By t1.User

它为我提供了我想要的User和CalendarTime,但没有获得日历ID,这就是我真正想要的。请帮忙。

2 个答案:

答案 0 :(得分:0)

这可以针对每组的前N个来解决:

top with tiesrow_number()一起使用:

select top 1 with ties 
  t1.User, t1.CalendarId, t2.CalendarTime
from table1 t1
  inner join table2 as t2
    on t1.Calendarid = t2.Calendarid
order by row_number() over (partition by t1.User order by t2.CalendarTime desc)

或使用common table expression(或派生的表/子查询)与row_number()

;with cte as (
  select t1.User, t1.CalendarId, t2.CalendarTime
    , rn = row_number() over (partition by t1.User order by t2.CalendarTime desc)
  from table1 t1
    inner join table2 as t2
      on t1.Calendarid = t2.Calendarid
)
select User, CalendarId, CalendarTime 
from cte
where rn = 1

答案 1 :(得分:0)

最接近您的脚本并非常简单:

SELECT t1.User, t2.*
FROM table1 t1
INNER JOIN table2 as t2
ON t1.CalendarID = t2.CalendarID
WHERE NOT EXISTS
  (
    SELECT 1 FROM table1 t1_2 
    INNER JOIN table2 t2_2
    ON t2_2.Calendar_ID = t1_2.Calendar_ID
    WHERE t1_2.User = t1.User
      AND t2_2.CalendarTime > t2.CalendarTime
  )