这是使用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,这是错误的,因为它有一个更新的记录超出上述范围
这将构成更大查询的一部分
答案 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;的列周围加上括号或引号,因为它也是关键字。