SQL MAX&在给定日期左右的同一列上的MIN

时间:2014-08-06 21:06:24

标签: sql sql-server

我有一个如下表结构:

+------+------+-------------+
|Person| Code | DateOccur   |
+------+------+-------------+
| 1545 | A    |   1/1/2014  |
| 2324 | K    |   3/4/2014  |
| 2324 | j    |   3/8/2014  |
| 1545 | B    |   3/6/2014  |
| 5663 | J    |   3/2/2014  |
+------+------+-------------+

主键可以被视为(PersonDateOccur),也就是说,同一个员工永远不会有两个具有相同日期的值。

我希望在给定特定日期SomeDate的情况下形成一个查询,其中我返回MAX(DateOccur) LESS而不是SomeDate以及MIN(DateOccur) GREATER而不是{{1} },以及两个相关的代码。

提供表格的示例是(w / SomeDate = 3/3/2014):

SomeDate

实现这一目标的最简单方法是什么?我读了一些MAX / MIN StackOverflow问题,但我特别需要在特定日期附近的值。理想情况下,当我知道必须有一个平稳的方法来做到这一点时,我不想最终被黑客攻击。

2 个答案:

答案 0 :(得分:1)

使用条件聚合执行此操作,然后加入结果。以下是获取日期的代码:

select person, max(case when DateOccur < @TheDate then DateOccur end) as DateBefore,
       min(case when DateOccur > @TheDate then DateAfter end) as DateAfter
from table t
group by person;

并得到其余的:

select x.person, x.DateBefore, tbefore.code, x.DateAfter, tafter.code
from (select person, max(case when DateOccur < @TheDate then DateOccur end) as DateBefore,
             min(case when DateOccur > @TheDate then DateOccur end) as DateAfter
      from table t
      group by person
     ) x left outer join
     table tbefore
     on x.person = tbefore.person and x.DateBefore = tbefore.DateOccur left outer join
     table tafter
     on x.person = tafter.person and x.DateAfter = tafter.DateOccur;

答案 1 :(得分:-1)

我假设你想避免使用基于min / max的子查询?也许您可以设想围绕ROW_NUMBER()OVER排名功能的解决方案?如果第一个表中有2行具有相同的DateOccur值,您希望发生什么?

http://msdn.microsoft.com/en-us/library/ms186734.aspx