【问题标题】:Subqueries / join on the same table同一张表上的子查询/连接
【发布时间】:2013-07-19 20:17:21
【问题描述】:

我有一个如下所示的表格

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          

【问题讨论】:

  • 您只想要最近的前 2 条记录?
  • 没有所有记录。我的表有数百条记录,这只是一个示例。
  • "but only for the most recent date" - 你如何决定最近的日期是什么? 11223344 and 121G55445588 and 855D不同的日期。
  • @RanEldan - 我认为他的意思是给定 VIN 的最近日期。
  • 正确,每个VIN的最新记录

标签: sql sql-server join subquery


【解决方案1】:

试试这个:

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;

【讨论】:

  • 这很复杂,我不明白,但它有效。谢谢
  • 一点也不。我添加了一个不太复杂的版本:)
【解决方案2】:

试试这个?这仅适用于每个 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

【讨论】:

  • 我想让它工作,但它不喜欢语法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多