2013-07-20 48 views
3

我有一个表,看起来像下面子查询/加入同一个表

tbl_veh

VIN   Record DateChange 
11223344  123A 6/24/2012 
11223344  121G 7/20/2013 
11223344  2D54 2/24/2013 
55445588  44D4 2/27/2012 
55445588  855D 3/15/2013 

所以我想选择VIN和记录,但只在最近的日期。我会怎么做?

所以,我还是会回到

11223344 and 121G 
55445588 and 855D   
+0

你只需要最近的2条记录? –

+0

没有全部记录。我拥有的表格有数百条记录,这只是一个示例。 –

+0

“但只限于最近的日期” - 您如何决定最近的日期? '11223344和121G'和'55445588和855D'有**不同**日期。 –

回答

5

试试这个:

WITH [ranked] AS (
    SELECT VIN, Record, RANK() OVER(PARTITION BY VIN ORDER BY DateChange DESC, newid()) [rank] 
    FROM tbl_veh) 

SELECT VIN, Record 
FROM [ranked] 
WHERE [rank] = 1; 

或 “不太复杂” 版本(不使用CTE):

SELECT VIN, Record 
FROM (
    SELECT VIN, Record, RANK() OVER(PARTITION BY VIN ORDER BY DateChange DESC, newid()) [rank] 
    FROM tbl_veh) as [ranked] 
WHERE [rank] = 1; 
+0

这是复杂的,我不明白它,但它的工作原理。谢谢 –

+0

没有。我添加了一个不太复杂的版本:) –

1

试试这个?这只适用于每个vim有一个Datechange。如果你有多个,你需要做变更

Select tbl_veh.vin, tbl_veh.record 
From tbl_veh 
Inner join (select vin, max(Datechange) 
      from tbl_veh 
      group by vin 
      ) last 
    On last.vin = tbl_veh.vin 
+0

我想要这个工作,但它不喜欢的语法 –