sql - 根据条件选择每个 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:
- 当每个 ID 存在一个等于 EntryDate 的 LoggedDate 时,仅显示该行。例如:ID 140960826 的输入日期为 6/15,LoggedDate 列中列出了 6/15。因此该 ID 将只返回一行 ID、EntryDate 和 LoggedDate = 6/15
- 当 ID 不包含等于 EntryDate 的记录日期时,则返回 min(loggedDate) > EntryDate。例如:ID 140960738 只需返回 LoggedDate = 6/12/2020 的一行
- 当 ID 不包含等于 EntryDate 的 loggedDate,并且没有 loggedDate>EntryDate 时,则返回 max(loggedDate) 例如:ID 140960836 必须返回 6/4/2020 作为 loggedDate
- 当 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
需要帮助解决这个问题
解决方案
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
推荐阅读
- javascript - 无法从 ajax 响应推送到全局数组
- javascript - 如何打印选定的用户?
- generics - 使用类泛型构造的子类型
- angular - 动态 Angular 元素之间的消息总线
- python - Python 中的大多数第三方包都可以安全地与 Django 和 Nginx 一起使用吗?
- java - 按钮不响应 onClick 方法
- node.js - node.js如何通过控制台输入数据?
- php - 在树莓派上通过 php 执行命令
- pandas - pandas 数据框迭代 2 个索引变量
- visual-studio - Visual Studio 2017 单元测试失败并出现错误找不到“C:\git\96522204\DS97981\A6\A6\bin\Debug\A6.exe”的调试符号