我有一个包含列的Budgets
表:
Id, ProjectCode, CreatedDate, IsReest, etc..
我必须在Budgets表中找到记录IsReest = 1,并且对于每个匹配的项目代码,我必须得到max(createddate),但不包括IsReest = 1记录。
我在结果中需要Id,ProjectCode,CreatedDate,因为我需要Id与其他表连接,ProjectCode和CreatedDate在结果中显示。
所以例如: (我使用|分隔符来分隔下表中的值)
Id | ProjectCode | CreatedDate | IsReest
------------------------------------------
1 | 12345 | 2016-10-16 | 1
2 | 12345 | 2016-10-14 | NULL
3 | 12222 | 2016-09-16 | NULL
4 | 12345 | 2016-10-15 | NULL
5 | 12333 | 2016-10-14 | NULL
6 | 12333 | 2016-10-15 | 1
这里Ids 1和6的记录IsReest = 1。我必须得到相同ProjectCode的max(CreatedDate)记录,排除IsReest = 1记录。
所以我必须得到结果:
Id | ProjectCode | CreatedDate | IsReset
-----------------------------------------
4 | 12345 | 2016-10-15 | NULL
5 | 12333 | 2016-10-14 | NULL
应忽略ProjectCode 12222的记录,因为它没有IsRest = 1的记录。
Id 4的记录在具有相同ProjectCode和IsReest<> 1的记录组中具有max(CreatedDate)。
有人可以帮我写这个查询吗?
提前致谢。
答案 0 :(得分:0)
试试这个:
declare @Table table(ID int, ProjectCode int, CreateDate date, IsReest int)
insert into @Table Values
(1, 12345, '2016-10-16' , 1)
,(2, 12345, '2016-10-14' , NULL)
,(3, 12222, '2016-09-16' , NULL)
,(4, 12345, '2016-10-15' , NULL)
,(5, 12333, '2016-10-14' , NULL)
,(6, 12333, '2016-10-15' , 1)
;WITH FLTR AS(
SELECT ProjectCode
FROM @Table
WHERE IsReest=1
)
, MX AS(
SELECT a.ProjectCode, MAX(a.CreateDate) AS CreateDate
FROM @Table as a
INNER JOIN FLTR as b on a.ProjectCode=b.ProjectCode
WHERE a.IsReest IS NULL
GROUP BY a.ProjectCode
)
SELECT a.*
FROM @Table AS A
INNER JOIN MX as b on a.ProjectCode=b.ProjectCode and a.CreateDate=b.CreateDate
答案 1 :(得分:0)
使用以下查询。它可能不是最好的解决方案,但效果很好。
声明@Table表(ID int,ProjectCode int,CreateDate date,IsReest int) 插入@Table值 (1,12345,'2016-10-16',1) ,(2,12345,'2016-10-14',NULL) ,(3,12222,'2016-09-16',NULL) ,(4,12345,'2016-10-15',NULL) ,(5,12333,'2016-10-14',NULL) ,(6,12333,'2016-10-15',1)
从@Table t join中选择* ( 从@Table中选择projectcode,max(CreateDate)作为CreateDate_Max,其中ProjectCode在 ( 从@Table bb中选择ProjectCode,其中bb.IsReest = 1 )和IsReest为NULL 按项目代码分组 )b 在b.projectcode = t.ProjectCode和b.CreateDate_Max = t.CreateDate