首页 > 解决方案 > 根据条件选择每个 ID 的单个日期

问题描述

我有下表,每个 ID 包含多个 LoggedDates。但是,每个 ID 只有一个 currentDate 和一个 entryDate:

ID          LoggedDate  CurrentDate EntryDate    
140960738   6/12/2020   6/16/2020   5/29/2020    
140960738   6/12/2020   6/16/2020   5/29/2020    
140960738   6/16/2020   6/16/2020   5/29/2020    
140960738   6/16/2020   6/16/2020   5/29/2020    
140960780   6/5/2020    6/24/2020   1900-01-01    
140960780   6/5/2020    6/24/2020   1900-01-01    
140960780   6/24/2020   6/24/2020   1900-01-01    
140960780   6/24/2020   6/24/2020   1900-01-01    
140960825   6/3/2020    6/19/2020   6/22/2020    
140960825   6/3/2020    6/19/2020   6/22/2020    
140960825   6/19/2020   6/19/2020   6/22/2020    
140960825   6/19/2020   6/19/2020   6/22/2020    
140960826   5/10/2020   6/2/2020    6/15/2020    
140960826   5/15/2020   6/2/2020    6/15/2020    
140960826   6/15/2020   6/2/2020    6/15/2020    
140960826   6/20/2020   6/2/2020    6/15/2020    
140960826   6/25/2020   6/2/2020    6/15/2020    
140960836   4/15/2020   6/25/2020   6/7/2020    
140960836   5/10/2020   7/2/2020    6/7/2020    
140960836   5/15/2020   6/26/2020   6/7/2020    
140960836   5/30/2020   6/22/2020   6/7/2020    
140960836   6/4/2020    6/24/2020   6/7/2020

我需要显示一个结果表,该表显示每个 ID 的单个日期,它根据以下条件结合了 LoggedDate 和 CurrentDate:

  1. 当每个 ID 存在一个等于 EntryDate 的 LoggedDate 时,仅显示该行。例如:ID 140960826 的输入日期为 6/15,LoggedDate 列中列出了 6/15。因此该 ID 将只返回一行 ID、EntryDate 和 LoggedDate = 6/15
  2. 当 ID 不包含等于 EntryDate 的记录日期时,则返回 min(loggedDate) > EntryDate。例如:ID 140960738 只需返回 LoggedDate = 6/12/2020 的一行
  3. 当 ID 不包含等于 EntryDate 的 loggedDate,并且没有 loggedDate>EntryDate 时,则返回 max(loggedDate) 例如:ID 140960836 必须返回 6/4/2020 作为 loggedDate
  4. 当 EntryDate = '1/1/1900' 时,将 CurrentDate 作为日期返回。

到目前为止,我已经尝试了以下 case 语句来根据条件添加一个标识符,然后将其用于提取结果日期,但这不起作用:

CASE WHEN EntryDate <> '1900-01-01' AND EntryDate <= LoggedDate
 THEN ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LoggedDate)
 WHEN EntryDate <> '1900-01-01' AND EntryDate > LoggedDate
 THEN ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LoggedDate)
 WHEN EntryDate = '1900-01-01' THEN 0
 END AS 'Identifier'

结果表需要如下所示:

ID         ResultsDate  EntryDate    
140960738   6/12/2020   5/29/2020    
140960780   6/24/2020   1900-01-01    
140960825   6/19/2020   6/22/2020    
140960826   6/15/2020   6/15/2020    
140960836   6/4/2020    6/7/2020

需要帮助解决这个问题

标签: sqlsql-server

解决方案


SELECT ID,
CASE WHEN (SELECT COUNT(*) FROM tbl WHERE ID = ppal.ID)>0 AND EntryDate <> '1900-01-01' THEN EntryDate
  WHEN (SELECT COUNT(*) FROM tbl WHERE ID = ppal.ID AND LoggedDate>ppal.EntryDate)>0 AND EntryDate <> '1900-01-01' THEN (SELECT MIN(LoggedDate) FROM tbl WHERE ID = ppal.ID AND LoggedDate>ppal.EntryDate)
  WHEN EntryDate = '1/1/1900' THEN CurrentDate
  ELSE (SELECT MAX(LoggedDate) FROM tbl WHERE ID = ppal.ID) END AS Date
FROM tbl ppal
GROUP BY ID, EntryDate

推荐阅读