根据第一个日期检查第一个值

时间:2017-11-21 15:26:01

标签: sql join

我有两张桌子

 guid | id   | Status
 -----| -----| ----------
 1    | 123  | 0
 2    | 456  | 3
 3    | 789  | 0

另一张表是

 id   | modified date | Status
------| --------------| ----------
1     | 26-08-2017    | 3
1     | 27-08-2017    | 0
1     | 01-09-2017    | 0
1     | 02-09-2017    | 0
2     | 26-08-2017    | 3
2     | 01-09-2017    | 0
2     | 02-09-2017    | 3
3     | 01-09-2017    | 0
3     | 02-09-2017    | 3
3     | 03-09-2017    | 0

每次第一个表中的状态都会针对每个ID进行更改时,它还会修改第二个表中的日期和状态。就像ID 1状态更改了4次。

我希望通过连接其第一个修改日期的状态值为0的两个表来选择这些ID。 在这个例子中,它应该只返回id 3,因为只有id 3的状态值为0,它在第一个修改日期01-09-2017.Ids 1& 2在其第一个修改日期中具有值3。

任何帮助

2 个答案:

答案 0 :(得分:1)

尝试使用以下(假设第一个表为A,第二个表为B):

;with cte as (
Select a.id, b.Status, row_number() over(partition by a.id order by [modified date] asc) row_num 
from A 
inner join B
 on a.id = b.id
)
Select * from cte where 
status = 0 and row_num = 1

答案 1 :(得分:0)

认为这会做你想要的。

WITH    cte
      AS (SELECT    id
          ,         ROW_NUMBER() OVER (PARTITION BY (id) ORDER BY [modified date]) RN
          ,         Status
          FROM      SecondTable
         )
SELECT  *
FROM    FirstTable
JOIN    cte ON FirstTable.id = cte.id
               AND RN = 1
WHERE   cte.Status = 0

只需展开*并返回您需要的字段。