SQL Server返回最近符合条件的记录

时间:2016-09-07 15:39:18

标签: sql-server sql-server-2012

这是使用SQL Server的问题。有更优雅的方式吗?

考虑一个表mytable(我使用的是Unix时间戳,我已将这些转换为可读日期以便于阅读)

ID  Foreign_ID  Date
-------------------------
1   1           01-Jul-15
2   2           01-Sep-16
3   3           05-Aug-16
4   2           01-Sep-15

我想提取Foreign_ID最近记录的最高ID(最高ID)日期在一个范围内,这个例子是2016年1月1日到2016年12月31日。以下作品如果用日期代替时间戳:

select distinct 
    Foreign_ID 
from 
    mytable l1 
where 
    (select top 1 Date 
     from mytable l2 
     where l2.Foreign_ID = l1.Foreign_ID 
     order by ID desc) >= **1 Jan 2016**  
    and 
    (select top 1 Date 
     from mytable l2 
     where l2.Foreign_ID = l1.Foreign_ID 
     order by ID desc) <= **31 Dec 2016**

那应该只返回Foreign_ID = 3。一个更简单的查询也会返回Foreign_ID 2,这是错误的,因为它有一个更新的记录超出上述范围

这将构成更大查询的一部分

2 个答案:

答案 0 :(得分:1)

假设SQL Server 2005+,您可以使用ROW_NUMBER

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER( PARTITION BY Foreign_ID 
                                    ORDER BY ID DESC)
    FROM dbo.YourTable
    WHERE [Date] >= '01-Jan-2016'   -- you need to use the right 
    AND [Date] <= '31-Dec-2016'     -- date format here
)
SELECT Foreign_ID
FROM CTE
WHERE RN = 1;

答案 1 :(得分:0)

如果是SQL Server 2008+,您可以使用:

select foreign_id
from (
    select foreign_id, row_number() over (order by id desc) as rseq
    from myTable 
    where Date >= value1 and Date <= value2
) as x
where rseq = 1

只需填写日期值,您可能需要在名为&#34; Date&#34;的列周围加上括号或引号,因为它也是关键字。