我有一个如下表结构:
+------+------+-------------+
|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 |
+------+------+-------------+
主键可以被视为(Person
,DateOccur
),也就是说,同一个员工永远不会有两个具有相同日期的值。
我希望在给定特定日期SomeDate
的情况下形成一个查询,其中我返回MAX(DateOccur)
LESS而不是SomeDate
以及MIN(DateOccur)
GREATER而不是{{1} },以及两个相关的代码。
提供表格的示例是(w / SomeDate
= 3/3/2014):
SomeDate
实现这一目标的最简单方法是什么?我读了一些MAX / MIN StackOverflow问题,但我特别需要在特定日期附近的值。理想情况下,当我知道必须有一个平稳的方法来做到这一点时,我不想最终被黑客攻击。
答案 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值,您希望发生什么?