本文介紹了T-SQL 最大日期和最小日期值單行的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
首先感謝幫助過這個(gè)復(fù)雜難查詢的朋友們.
First of all I would like to thank the friends who helped this complex and difficult query.
我有三張桌子
表一
StaffId FirstName LastName staffType
---------------------------------------
1 Adam Sorme Student
2 Lara Sandra Teacher
3 Jack Jones Student
表 2
GateId GateName
---------------------------------------
1 frontDoor
2 superDoor
表 3
Id transitionDate GateId StaffId
---------------------------------------
1 2018-01-1 08:00:00 1 1
2 2018-01-1 10:00:00 2 1
3 2018-01-1 20:00:00 2 1
4 2018-01-2 07:00:00 1 2
5 2018-01-2 10:00:00 1 3
6 2018-01-9 12:00:00 2 2
我想要學(xué)生每天的第一個(gè)和最后一個(gè)動(dòng)作.如果在指定日期之間沒有可用的移動(dòng),則必須將值設(shè)置為 null
I want the first and last movements of students for each day. Value must be set to null if no movement is available between the specified dates
transitionDate> '2018-01-1 00:00:00 000'
and transitionDate< '2018-01-03 00:00:00 000'
輸出:
Id Date MinTransitionDate MaxTransitionDate FirstGateName LastGateName StaffId StaffType
1 2018-01-01 2018-01-1 08:00:00 2018-01-1 20:00:00 frontDoor superDoor 1 Student
2 2018-01-01 null null null null 3 student
3 2018-01-02 null null null null 1 student
4 2018-01-02 2018-01-2 10:00:00 null frontDoor null 3 student
推薦答案
你可以試試像下面這樣的查詢
you can try a query like below
查看工作演示
create table staff(StaffId int, FirstName nvarchar(10), LastName nvarchar(10), staffType nvarchar(10))
insert into staff values
(1,'Adam','Sorme','Student')
,(2,'Lara','Sandra','Teacher')
,(3,'Jack','Jones','Student')
go
create table gate(GateId int, GateName nvarchar(10))
insert into gate values
(1,'frontDoor')
,(2,'superDoor')
go
create table logs
(Id int, transitionDate datetime, GateId int, StaffId int)
insert into logs values
(1,'2018-01-1 08:00:00',1,1)
,(2,'2018-01-1 10:00:00',2,1)
,(3,'2018-01-1 20:00:00',2,1)
,(4,'2018-01-2 07:00:00',1,2)
,(5,'2018-01-2 10:00:00',1,3)
,(6,'2018-01-9 12:00:00',2,2)
go
declare @startdate datetime, @enddate datetime
select @startdate='2018-01-1 00:00:00' , @enddate='2018-01-03 00:00:00'
; with tempSet as
(
select
transitionDatetime=l.transitionDate,
gateName=g.gateName,
staffid=l.staffid,
idx=
row_number() over(partition by l.staffid order by l.transitionDate ) -
row_number() over(partition by l.staffid,cast(l.transitionDate as date) order by l.transitionDate ),
transitionDate=cast(l.transitionDate as date)
from
logs l inner join staff s on
l.staffid=s.staffid and staffType='Student'
join gate g on g.gateid=l.gateid
)
, groupedSet as
(
select
t1.*,
FirstGateName=t2.gatename,
lastGateName=t3.gatename
from
(
select
staffid,
mintransitionDate=min(transitionDatetime),
maxtransitionDate= case when count(1)>1 then max(transitionDatetime) else null end,
transitionDate=max(transitionDate),
idx
from
tempSet
group by staffid,idx
) t1
left join
tempSet t2
on t1.idx=t2.idx
and t1.staffid=t2.staffid and t1.mintransitionDate=t2.transitionDatetime
left join
tempSet t3
on t1.idx=t3.idx
and t1.staffid=t3.staffid and t1.maxtransitionDate=t3.transitionDatetime
where t1.transitionDate between @startdate and @enddate
)
select
t.*,
g.mintransitionDate,
g.maxtransitionDate,
g.FirstGateName,
g.LastGateName
from
groupedSet g
right join
(
select
d,
staffid
from
(
select
top (select datediff(d,@startdate, @endDate))
d=dateadd(d,row_number() over(order by (select null))-1, @startDate)
from
sys.objects o1 cross join sys.objects o2
)tally
cross join
staff
where staff.stafftype='Student'
)t
on cast(t.d as date)=cast(g.transitionDate as date) and t.staffid=g.staffid
order by t.d asc, t.staffid asc
這篇關(guān)于T-SQL 最大日期和最小日期值單行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!
【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!