如何在sql中找出两个不同条件的最大字段

时间:2018-03-10 05:38:51

标签: sql-server

我有一张表EMPDATA,其中包含以下数据:

EntityId    MeetDate    SourceCode  Status
1           06.11.2017   AB          FNL
1           05.2.2018    AB          NO
1           09.3.2018    AB          FNL
3           07.12.2016   AB          FNL
3           09.2.2015    AB          FNL
3           07.8.2014    IU          FNL
3           08.7.2017    IU          FNL

条件:

1)MeetDate列将在输出

中分成两列

1a)LastDate:这将是Meetdate的最新SourceCode     'AB'和状态'FNL'。

1b)InterimDate:这是Meetdate'IU'的最新SourceCode,发生在Meetdate'AB'的最新SourceCode之后和Status'FNL'。

对于没有IU源代码的记录,interimdate将为null。

即:输出如下:

EntityId    LastDate    InterimDate 
1           09.3.2018      NULL          
3           07.12.2016    08.7.2017  

2 个答案:

答案 0 :(得分:2)

@Anita,我没有回答你的最新问题" 查找不同条件的最长日期[重复] "由于设置为重复的问题。您可以尝试以下查询

parameters.setPreviewSize(w, h);

答案 1 :(得分:1)

您可以使用条件聚合轻松实现预期输出:

SELECT EntityId,
       MAX(CASE 
              WHEN SourceCode = 'AB' AND status = 'FNL' THEN MeetDate 
           END) AS LastDate,
       MAX(CASE WHEN SourceCode = 'IU' THEN MeetDate END) AS InterimDate          
FROM mytable
GROUP BY EntityId

此查询实现OP中描述的所有逻辑,除了:

  • InterimDate ...在Meetdate'AB'和状态'FNL'的最新SourceCode之后发生。

您可以使用CTE实现此目的,以便代码看起来更干净:

;WITH CTE AS (
SELECT EntityId,
       MAX(CASE 
              WHEN SourceCode = 'AB' AND status = 'FNL' THEN MeetDate 
           END) AS LastDate,
       MAX(CASE WHEN SourceCode = 'IU' THEN MeetDate END) AS InterimDate          
FROM mytable
GROUP BY EntityId
)
SELECT LastDate, 
       CASE 
          WHEN InterimDate > LastDate THEN InterimDate
       END AS InterimDate
FROM CTE 

Demo here