2017-11-05 13 views
1

以下のクエリは、複数のターミナル(アウトレット)で従業員のログ(出席)情報を取得します。SQL Server:各従業員の最終レコードを選択

たとえば、1人の従業員が3日のうちに3つの店舗を訪れた場合、最後のログ情報(彼が最後に訪れた店舗)を取得したいと考えています。

問合せ:

select 
    [EmpCode], 
    Name, 
    max(convert(datetime, [LogDate])) as [Last Log date], 
    Outlet.abr as [Last Log Location] 
from 
    AccessLog 
inner join 
    GEmp on GEmp.EmpCode = AccessLog.EmployeeID 
inner join 
    Outlet on Outlet.Code = AccessLog.TerminalID 
where 
    InOut = '0' 
group by 
    GEmp.EmpCode, Name, Outlet.abr 

出力:

EmpCode Name Last Log date Last Log Location 
-------------------------------------------------- 
362334 Emp1 10/4/2017  loc1 
362334 Emp1 11/4/2017  loc2 
362334 Emp1 5/30/2017  loc3 
362336 Emp2 10/6/2017  loc1 
362336 Emp2 11/4/2017  loc2 

所望の出力:

EmpCode Name Last Log date Last Log Location 
------------------------------------------------- 
362334 Emp1 11/4/2017  loc2 
362336 Emp2 11/4/2017  loc2 
+0

何を試しましたか? 'order By'と' select top1'を使うことを検討してください – Mzf

答えて

0

使用row_number()

select e.Name, al.LogDate, o.abr 
from (select al.*, 
      row_number() over (partition by al.EmployeeId order by al.LogDate desc) as seqnum 
     from AccessLog al 
     where al.InOut = 0 
    ) al join 
    GEmp e 
    on e.EmpCode = al.EmployeeID join 
    Outlet o 
    on o.Code = al.TerminalID 
where al.seqnum = 1; 

注:

  • 私はテーブルの略語です表の別名を追加しました。これにより、クエリの書き込みと読み込みが容易になります。
  • すべての列名を修飾しました(うまくいけば正しく!)ので、データがどこから来ているのかがはっきりしています。
  • '0'を一重引用符で削除しました。私の前提は、値が実際に数値であるということです。
  • 問題の解決方法は、サブクエリでrow_number()を使用することです。
0

私がテストすることができないんだけど、ここで正しい方法である:

Select * 
    From 
    (
    Select ilv.*, row_number() over (partition by empcode order by logdate desc) 
    r 
    From 
    (...) ilv 
    ) ilv2 
    Where r=1 

同じ最終日が複数回出現する場合は、タイブレーカーが必要です。上記の質問にはそれがないので、冪等ではありません。

関連する問題