每个记录的sql连接在同一个表上,不包括源记录并获取最大记录

时间:2016-10-20 21:14:53

标签: sql sql-server

我有一个包含列的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)。

有人可以帮我写这个查询吗?

提前致谢。

2 个答案:

答案 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