首页 > 解决方案 > 从表中的重复项中选择最小日期记录

问题描述

假设我有这个表“合同”,它在“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

标签: sqltsql

解决方案


也许这会有所帮助:

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

推荐阅读