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

时间:2014-06-05 15:56:49

标签: 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

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

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来组装记录。遗憾的是,这不是一个长期的解决方案。

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

4 个答案:

答案 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]

试试这个。