感谢您的时间!对于每个用户,我希望输出一个包含其最早生效日期和最新结束日期的列,以及此表和其他表中的其他列(这些内容对每个用户都是一致的)。以下是输入数据的格式。
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
这基本上是我所希望的结果:
User Eff_Date End_Date Otherstuff...
----|-------------|------------|---------
001 | 20140101 | 99990101
002 | 20140201 | 99990101
003 | 20140401 | 20140402
004 | 20140501 | 20250901
以下是我的尝试:
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
当我运行此功能时,上面的003和004等用户显示正常,但001和002之类的用户根本无法显示。
我对SQL很新,所以我可能会犯一个非常基本的错误。如果是这样的话,请随时告诉我。另外,我无法控制数据源,所以我无法在源头修复此问题。我发现这个问题的唯一原因是使用SQL输出每个用户记录,然后使用VBA来组装记录。遗憾的是,这不是一个长期的解决方案。
如果您需要更多信息,请告诉我,我欣赏一切,正确方向的推动可能足以帮助我解决这个问题。再次感谢你的时间!
答案 0 :(得分: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
编辑:虽然请记住,如果日期存储为字符串,MIN / MAX将对字符串起作用,而不是日期。如果他们被存储为字符串,则可能需要转换为Date
。
答案 1 :(得分:0)
尝试使用NOT EXISTS
子句,示例可能不是您想要的,但显示可能对您有帮助的子句
SELECT M.user, M.Eff_Date, M.End_Date, M.otherstuff
FROM tbluser M
WHERE NOT EXISTS(
SELECT * FROM tbluser N
WHERE M.user=N.user AND (N.Eff_Date > M.Eff_Date OR N.Eff_Date = M.Eff_Date AND N.End_Date > M.End_Date)
)
答案 2 :(得分:0)
这应该有效:
SELECT M.user, M.mineffdate, M.maxenddate, M.otherstuff, a.otherstuff
FROM (SELECT USER, MAX(m.end_date) as maxenddate,
MIN(m.eff_date) as mineffdate,
MIN(otherstuff) AS minotherstuff
from tbluser
group by user) M
LEFT JOIN otherstuff A ON A.[user]=M.[user]
答案 3 :(得分:0)
这是我对问题的快速解决方案
WITH MinTable As(
SELECT [User],MIN(Eff_Date) Eff_Date FROM Test GROUP BY [User]),
MaxTable As(
SELECT [User],Max(End_Date) End_Date FROM Test GROUP BY [User])
SELECT MinTable.[User], MinTable.Eff_Date, MaxTable.End_Date FROM MinTable INNER JOIN MaxTable ON MinTable.[User] = MaxTable.[User]
试试这个。