2017-11-06 5 views
2

これは以前に回答されている可能性がありますが、私は問題を説明するのが難しいです。2つのテーブルを結合し、1つの集計値とユニークな値を得る

のは、それだけでCalandarIDに関連付けられているこの最高CalendarTimeが何であるかに基づいて、単一のユーザー名、およびカレンダーIDを取得し、2つのテーブルを結合である私がやりたい私は二つのテーブル

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 

を持っているとしましょう。

だから私は

User CalendarID 
Joe 3 
Sam 4 
Bob 1 
Jim 3 

私が管理している最も近い私のユーザーとCalendarTime私が望むことではなく、カレンダーIDを取得

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 

あるが、返すようにクエリをしたいと思いますそれは私が本当に欲しいものです。助けてください。

答えて

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 
) 
+0

これはそれでした。まだそれがなぜ機能するのか、まだ頭を包んでいないのですが、それはあります。ありがとう。 – qotile

0

これは、グループごとに上部Nについて解くことができる:

row_number()top with tiesを使用して:

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 
+0

私は次回にフォーマットをしてはいけません:( –

+1

@JuanCarlosOropezaあなたが投稿をコメントしていない限り、編集を完了する前に5分後に編集を終了します。^ – SqlZim

関連する問題