我正在使用SQL Server 2014
,我有以下T-SQL查询:
Use MyDatabase
;WITH Query_CTE AS
(
SELECT
ResID, Name,
ArrivalDate, Status,
ProfileID,
ROW_NUMBER() OVER(PARTITION BY [ResID] ORDER BY [StayDate]) AS xy
FROM
(SELECT *
FROM View1) xx
)
SELECT *
FROM Query_CTE
WHERE Query_CTE.[xy] = 1
我需要修改上面的查询,以便输出ArrivalDate
介于'2018-04-01'
and和'2018-12-31'
之间的所有记录,这些记录也存在于基于ArrivalDate
的'2018-04-01'
小于ProfileID
的记录列表中。
我怎样才能做到这一点?
首先,你需要你的CTE的where子句,只获得到达日期在2018-04-01
和2018-12-31
之间的记录。然后你需要添加EXISTS
来检查2018-04-01
之前的记录中是否也存在相同的配置文件ID:
;WITH Query_CTE AS
(
SELECT
ResID
,Name
,ArrivalDate
,Status
,ProfileID
,ROW_NUMBER() OVER(PARTITION BY [ResID] ORDER BY [StayDate]) AS xy
FROM View1 v1
WHERE ArrivalDate >= '2018-04-01'
AND ArrivalDate <= '2018-12-31'
AND EXISTS
(
SELECT 1
FROM View1 v2
WHERE v2.ProfileID = v1.ProfileID
AND v2.ArrivalDate < '2018-04-01'
)
)
SELECT * FROM Query_CTE
WHERE Query_CTE.[xy] = 1
附注:cte中的派生表是完全冗余的,所以我删除了它。