SQL查找最接近日期的条目

时间:2016-04-18 16:37:42

标签: sql sql-server-2008

我正在尝试将表格壁橱中的最后一个条目过滤到定义的日期,我遇到了困难。任何输入都非常感谢。谢谢!我正在运行Microsoft SQL Server 2008。

表:

code | account | date            | amount
1    | 1234    | 2016-02-28      | 500
2    | 1234    | 2016-03-01      | 650
3    | 1234    | 2016-03-05      | 842
4    | 7890    | 2016-02-28      | 500
5    | 7890    | 2016-03-30      | 550

我想只选择日期最接近3月31日的条目(' 2016-03-31')。在此示例中,帐户1234最接近2016-03-31的条目是条目#3,而帐户7890最接近2016-03-31的条目是条目#5。换句话说,我希望所有帐户的最后一个条目等于或等于日期。

3    | 1234    | 2016-03-05      | 842
5    | 7890    | 2016-03-30      | 550

3 个答案:

答案 0 :(得分:1)

由于没有指定DBMS,这里有一种在SQL Server中执行此操作的hacky方法。它在指定日期之前和之后抓取记录:

select * from (
    select top(1) * FROM mytable
    where date >= '2016-03-31' order by date asc
) t1
union
select * from (
    select top(1) * FROM mytable
    where date <= '2016-03-31' order by date desc
) t2 

答案 1 :(得分:1)

大多数DBMS(包括MS SQL Server)都支持分析函数:

select *
from
 (
   select *,
      row_number()                    -- create a ranking
      over (partition by account      -- for each account
            order by date desc) as rn -- based on descending dates
   from tab
   where date <= date '2016-03-31'
 ) dt
where rn = 1                          -- return the row with the "closest" date

答案 2 :(得分:0)

这应该做你想要的,并且应该很容易理解,不需要进一步解释:

select t.* 
from your_table t
join (
    select account, max(date) as date 
    from your_table  
    where date <= '2016-03-31'
    group by account
) as subquery on t.account = subquery.account and t.date = subquery.date

编辑:对于SQL Server,最好使用分析函数(如row_number)