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来组装记录.遗憾的是,这不是一个长期的解决方案.
如果您需要更多信息,请告诉我,我欣赏一切,正确方向的推动可能足以帮助我解决这个问题.再次感谢您的时间!
使用窗口函数怎么样?
试试这个:
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
如果它们存储为字符串,可能需要转换为.
归档时间: |
|
查看次数: |
1865 次 |
最近记录: |