sql - 从表中的重复项中选择最小日期记录
问题描述
假设我有这个表“合同”,它在“END”列中具有相同 ID 的重复记录。
ID | 开始 | 结尾 |
---|---|---|
20 | 2016-01-01 | 9999-12-31 |
20 | 2020-01-01 | 9999-12-31 |
30 | 2018-01-01 | 2019-02-28 |
30 | 2019-03-01 | 9999-12-31 |
30 | 2020-02-01 | 9999-12-31 |
10 | 2019-01-01 | 2019-06-30 |
10 | 2019-07-01 | 2020-02-29 |
10 | 2020-03-01 | 9999-12-31 |
我想在“开始”列中获取所有在“结束”列中具有重复记录且日期为“9999-12-31”的 ID 的最旧日期。所以对于这个例子,我希望得到:
ID | 开始 |
---|---|
20 | 2016-01-01 |
30 | 2019-03-01 |
我做了一个SQL脚本,但应该有更好的方法。
select ID, MIN(Begin) from
(
select * from contract m where exists
(
select 1 from contract v where END = '9999-12-31' and v.ID = m.ID
having count(ID)=2
)
and END = '9999-12-31'
)a
group by FUN_ID
解决方案
也许这会有所帮助:
DECLARE @Tab TABLE(ID INT,[Begin] DATE,[End] DATE)
INSERT @Tab
VALUES
(20,'2016-01-01','9999-12-31')
,(20,'2020-01-01','9999-12-31')
,(30,'2018-01-01','2019-02-28')
,(30,'2019-03-01','9999-12-31')
,(30,'2020-02-01','9999-12-31')
,(10,'2019-01-01','2019-06-30')
,(10,'2019-07-01','2020-02-29')
,(10,'2020-03-01','9999-12-31')
;WITH cte AS(
SELECT *
FROM @Tab
WHERE [End] = '9999-12-31'
)
SELECT ID, MIN([Begin]) AS [Begin]
FROM cte
GROUP BY ID
HAVING COUNT(*) > 1
推荐阅读
- html - wordpress:添加一个
- java - 用 Java 重写 OPL 模型
- java - 方法重载产生 java.lang.StackOverflowError
- javascript - 在本机反应中隐藏按钮
- python-3.x - 如何从熊猫数据框中选择一对?
- excel - 在 Excel 中提取大写单词
- arrays - 在 Fortran 中的特定索引处将数组添加到更长数组的巧妙方法?
- java - 使用 Tomcat 9 和 Java10 停止 SpringBoot Web 应用程序时的非法反射访问
- java - 无法使用 ServletFileUpload 上传 100MB 文件
- javascript - jquery IF 在 iphone 上无法按预期工作