1个sql查询结果到另一个

时间:2017-12-11 23:06:48

标签: sql sql-server select

我试图从我从2个表创建的视图中获取不同的数据

我有一个包含以下数据的视图

emplid  date_and_time   cardreader  empl_first_name empl_last_name
845         2017-12-12 08:38:02.000 GH-ENTRY-01 Amanda  Gill
61811       2017-12-12 08:38:00.000 GH-ENTRY-02 Julie   Moore
61618       2017-12-12 08:36:02.000 GH-ENTRY-01 THOMAS  HOEY
62094       2017-12-12 08:36:01.000 GH-EXIT-03  Mikaela Dawson
56481       2017-12-12 08:35:00.000 GH-ENTRY-02 Chase   Bennett
5134        2017-12-12 08:33:02.000 GH-ENTRY-05 Martin  Byron
51532       2017-12-12 08:33:01.000 GH-ENTRY-05 Gary    Brennan
61996       2017-12-12 08:32:04.000 GH-ENTRY-05 Dylan   Roberts
58447       2017-12-12 08:32:03.000 GH-ENTRY-05 Michael Guy
61931       2017-12-12 08:32:01.000 GH-EXIT-01  Mark    Gibbs
61991       2017-12-12 08:32:00.000 GH-EXIT-02  James   Keysell
41932       2017-12-12 08:31:00.000 GH-ENTRY-05 Mark    Sadowski
40437       2017-12-12 08:27:01.000 GH-ENTRY-05 John    Manning
62094       2017-12-12 08:27:00.000 GH-ENTRY-01 Mikaela Dawson
62094       2017-12-12 08:25:01.000 GH-EXIT-01  Mikaela Dawson
61758       2017-12-12 08:25:00.000 GH-ENTRY-02 Deries  Gordon
62094       2017-12-12 08:24:01.000 GH-ENTRY-01 Mikaela Dawson
51532       2017-12-12 08:24:00.000 GH-EXIT-05  Gary    Brennan
61067       2017-12-12 08:23:02.000 GH-ENTRY-05 Matthew Hutchinson
61185       2017-12-12 08:23:01.000 GH-ENTRY-05 Brendan Mckew
61991       2017-12-12 08:21:01.000 GH-ENTRY-02 James   Keysell

我想获取每个emplid的最新记录 所以上面的查询为我提供了数据order by date_and_time descemplid列会有重复

所以我需要选择不同的emplid,如下所示

Select distinct emplid
from [EBI_Interface].[dbo].[GateTimes_EmployeeNames]

如何将其传递给第一个查询,以便仅获取最近日期的不同emplid

2 个答案:

答案 0 :(得分:0)

这是一种方法:

select e.*
from [EBI_Interface].[dbo].[GateTimes_EmployeeNames] e
where e.datetime = (select max(e2.datetime)
                    from [EBI_Interface].[dbo].[GateTimes_EmployeeNames] e2
                    where e2.emplid = e.emplid
                   );

规范解决方案是使用row_number(),但我认为SQL Server在优化此查询方面做得更好(使用正确的索引)。

答案 1 :(得分:0)

select e1.* 
from [EBI_Interface].[dbo].[GateTimes_EmployeeNames] e1
join (select e21.emplid, max(e21.date_and_time) 'dt' 
        from [EBI_Interface].[dbo].[GateTimes_EmployeeNames] e21
        group by e21.emplid
    ) e2 on e1.emplid=e2.emplid and e1.date_and_time=e2.dt

如果你想以其他方式写它