2016-12-02 28 views
0

第一和最后的检查,我需要每个员工的第一个入住和最后退房每一天的列表...工人的每个

我得到的结果,从下面的查询什么只是,每天一个数据......

SELECT 
    p.prsnCode [Sicil No] 
    ,p.[prsnName1] 
    ,p.[prsnName2] 
    ,t.[ioTransactionDate] 

     ,[Giris/Cikis] = (
    case 
    when [ioStatus] = 0 then 'Giris' 
    when [ioStatus] = 1 then 'Cikis' 
    else 'Uzaya Gitti' end) 


    FROM [IOTransaction] t 

    left join dbo.Person p on t.ioPrsnRefId = p.prsnRefId 

    where t.[ioTransactionDate] = (select MIN(m.[ioTransactionDate]) from IOTransaction m 
            where m.ioPrsnRefId = t.ioPrsnRefId and CAST(m.[ioTransactionDate] AS DATE) = CAST(t.[ioTransactionDate] AS DATE) 
              group by m.ioPrsnRefId) 
     OR t.[ioTransactionDate] = (select MAX(m.[ioTransactionDate]) from IOTransaction m 
            where m.ioPrsnRefId = t.ioPrsnRefId and CAST(m.[ioTransactionDate] AS DATE) = CAST(t.[ioTransactionDate] AS DATE) 
              group by m.ioPrsnRefId) 

group by t.ioPrsnRefId, prsnCode, prsnName1 , prsnName2, t.[ioTransactionDate], ioStatus 


    ORDER BY P.prsnCode 

我也尝试这种group by m.ioPrsnRefId, CAST(m.[ioTransactionDate] AS DATE)添加到where子句,但它给错误...(子查询返回多个值。)

+0

我不能编辑问题,查询似乎工作正常,但它的作品约3分钟列出。 新的问题是,有什么办法来扣紧这个查询? –

+0

为什么不在'select'语句中放置'Min(t。[ioTransactionDate]'和'Max(t。[ioTransactionDate])',然后删除where子句或放入'TransactionDate'的日期范围 –

回答

0

试试这个。如果我做了一些不正确的假设,我已经包含了样本表和我使用的数据。

create table person 
(
    prsnRefId int, 
    prsnCode varchar(50), 
    prsnName1 varchar(50), 
    prsnName2 varchar(50) 
); 

create table IOTransaction 
(
    ioPrsnRefId int, 
    ioTransactionDate datetime, 
    ioStatus int 
); 

insert into person values(1,'code1','Bob','Carolgees'); 
insert into person values(2,'code2','Diana','Dors'); 

insert into IOTransaction values(1,'01-jan-2016 09:00:00',0); 
insert into IOTransaction values(1,'01-jan-2016 12:00:00',1); 
insert into IOTransaction values(1,'01-jan-2016 13:00:00',0); 
insert into IOTransaction values(1,'01-jan-2016 18:00:00',1); 
insert into IOTransaction values(1,'02-jan-2016 09:01:00',0); 
insert into IOTransaction values(1,'02-jan-2016 12:01:00',1); 
insert into IOTransaction values(1,'02-jan-2016 13:01:00',0); 
insert into IOTransaction values(1,'02-jan-2016 18:01:00',1); 

insert into IOTransaction values(2,'01-jan-2016 08:30:00',0); 
insert into IOTransaction values(2,'01-jan-2016 12:30:00',1); 
insert into IOTransaction values(2,'01-jan-2016 13:30:00',0); 
insert into IOTransaction values(2,'01-jan-2016 17:45:00',1); 
insert into IOTransaction values(2,'02-jan-2016 08:31:00',0); 
insert into IOTransaction values(2,'02-jan-2016 12:31:00',1); 
insert into IOTransaction values(2,'02-jan-2016 13:31:00',0); 
insert into IOTransaction values(2,'02-jan-2016 17:46:00',1); 

with ins as (
    select ioPrsnRefId, 
     convert(date, ioTransactionDate) as date, 
     IOTransactionDate, 
     row_number() over (partition by ioPrsnRefId, convert(date, ioTransactionDate) order by ioTransactionDate) rn 
    from IOTransaction 
    where ioStatus = 0 

), 
outs as (
    select ioPrsnRefId, 
     convert(date, ioTransactionDate) as date, 
     IOTransactionDate, 
     row_number() over (partition by ioPrsnRefId, convert(date, ioTransactionDate) order by ioTransactionDate desc) rn 
    from IOTransaction 
    where ioStatus = 1 
) 
SELECT p.prsnCode [Sicil No] 
    ,p.[prsnName1] 
    ,p.[prsnName2] 
    ,t.[ioTransactionDate] 
    ,[Giris/Cikis] = (
    case 
    when [ioStatus] = 0 then 'Giris' 
    when [ioStatus] = 1 then 'Cikis' 
    else 'Uzaya Gitti' end) 
FROM [IOTransaction] t 
left join dbo.Person p on t.ioPrsnRefId = p.prsnRefId 
left join ins on p.prsnRefId = ins.ioPrsnRefId 
    and t.ioTransactionDate = ins.ioTransactionDate 
left join outs on p.prsnRefId = outs.ioPrsnRefId 
    and t.ioTransactionDate = outs.ioTransactionDate 
where ins.rn = 1 or outs.rn=1 
+0

感谢您的时间......您的查询在30秒内给出了414,691行,我在3分钟内给出了417,727行......并且时间条件为'ioTransactionDate>'2016-12-01 00:00:00.000'' mine 66901行反对你63,944行 –

+0

和你的一些重复结果... [见图片](http://imgh.us/Untitled_812.png) –

+0

这是我的截图[见我的](http:// img.us/Untitled_813.png) –