SQL选择不同行中的最大和最小日期

Wol*_*ves 0 sql sql-server date max min

谢谢你的时间!对于每个用户,我希望输出一个包含最早生效日期和最新结束日期的列,以及此表和其他表中的其他列(这些内容对每个用户都是一致的).以下是输入数据的格式.

User   Eff_Date     End_Date    Otherstuff...
----|-------------|------------|---------
001 | 20140101    | 20140106
001 | 20140107    | 99990101
002 | 20140201    | 20140305
002 | 20140306    | 20140319
002 | 20140320    | 99990101
003 | 20140401    | 20140402
004 | 20140501    | 20250901
Run Code Online (Sandbox Code Playgroud)

这基本上是我所希望的结果:

User   Eff_Date     End_Date    Otherstuff...
----|-------------|------------|---------
001 | 20140101    | 99990101
002 | 20140201    | 99990101
003 | 20140401    | 20140402
004 | 20140501    | 20250901
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

SELECT DISTINCT M.user, T.mineffdate, T.maxenddate, A.otherstuff


FROM tbluser M
LEFT JOIN otherstuff A ON A.[user]=M.[user]
INNER JOIN (SELECT user, MAX(m.end_date) as maxenddate, MIN(m.eff_date) as mineffdate FROM tbluser M GROUP BY user) T ON T.user = M.user AND T.maxenddate = m.end_date AND T.mineffdate = M.eff_date
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,像上面的003和004这样的用户表现得很好,但像001和002这样的用户根本没有显示出来.

我对SQL很新,所以我可能会犯一个非常基本的错误.如果是这样的话,请随时告诉我.另外,我无法控制数据源,所以我无法在源头修复此问题.我发现这个问题的唯一原因是使用SQL输出每个用户记录,然后使用VBA来组装记录.遗憾的是,这不是一个长期的解决方案.

如果您需要更多信息,请告诉我,我欣赏一切,正确方向的推动可能足以帮助我解决这个问题.再次感谢您的时间!

MAW*_*656 5

使用窗口函数怎么样?

试试这个:

Select distinct t.[user],
Min(t.eff_date) Over (Partition By [user]) as EffDate,
Max(t.End_Date) Over (Partition By [user]) as EndDate,
'Other' as [Other]
From tblUser t
Run Code Online (Sandbox Code Playgroud)

编辑:虽然请记住,如果日期存储为字符串MIN/MAX将对字符串,而不是日期.Date如果它们存储为字符串,可能需要转换为.

  • @Wolves你不能得到"精确重复".您的问题可能来自您的其他联接数据,不是吗? (2认同)