我有这样的表
insert into attn (StaffNo, ADate, ATime) values ('12345', '12-02-2013', 09.10)
insert into attn (StaffNo, ADate, ATime) values ('12345', '12-02-2013', 10.03)
insert into attn (StaffNo, ADate, ATime) values ('12345', '12-02-2013', 10.40)
insert into attn (StaffNo, ADate, ATime) values ('12345', '12-02-2013', 17.30)
我想要这种格式
输出:
StaffNo ADate InTime OutTime
12333, 12-02-2013 09.10 10.03
12333, 12-02-2013 10.40 17.30
答案 0 :(得分:1)
这样的内容适用于您的示例行:
with attnJoin as
(
select attn.StaffNo
, attn.ADate
, InTime = attn.ATime
, OutTime = prev.ATime
, eventNumber = row_number() over (partition by attn.StaffNo, attn.ADate order by attn.ATime)
from attn
outer apply
(
select top 1 ATime
from attn prev
where attn.StaffNo = prev.StaffNo
and attn.ADate = prev.ADate
and attn.Atime < prev.ATime
order by ATime
) prev
)
select StaffNo
, ADate
, InTime
, OutTime
from attnJoin
where eventNumber % 2 = 1
然而,在某些情况下这可能是不稳定的,例如:缺少数据,多天等。只有您在查看实时数据时才能确定。
另外,正如已经指出的那样,设计可能存在更多基本问题,例如与不需要的日期分开存储时间。如果你有一个标志指示哪一行进/出,那也会更容易。