Sql Server获取第一个匹配值

Sql Server获取第一个匹配值,sql,sql-server,Sql,Sql Server,我有两个表历史和历史值: 历史 历史价值 现在我需要一个查询,在这里我可以从特定版本中获得每个控件的上一个historyvalue列表,如: 从版本3->接收-> HVID | ControlID | Value b2 | c1 | value2 b3 | c2 | value3 我试过这样的方法: Select HVID, ControlId, max(Version), Value from ( Select HVID, ControlId, Version, Value

我有两个表历史和历史值:

历史 历史价值 现在我需要一个查询,在这里我可以从特定版本中获得每个控件的上一个historyvalue列表,如:

从版本3->接收->

HVID | ControlID | Value
b2 | c1 | value2
b3 | c2 | value3
我试过这样的方法:

Select HVID, ControlId, max(Version), Value from 
(   
    Select HVID, ControlId, Version, Value
    from History inner JOIN
         Historyvalues ON History.HID = Historyvalues.HID
    where Version <= 3  
) as a
group by ControlId
order by Version desc
但这是行不通的

有什么想法吗

非常感谢你的帮助

向您致意这是您的解决方案

 Select  Historyvalues.HVID,Historyvalues.ControlID,Historyvalues.Value
 from Historyvalues
 inner join History on Historyvalues.hid=History.hid
 where Historyvalues.hvid in (
            select MAX(Historyvalues.hvid) from Historyvalues
        inner join History on Historyvalues.hid=History.hid
        group by ControlID)

每个控件的最新版本以及您的特定版本,其中t1.version应该Historyvalues ON History.HID=Historyvalues.HVID被隐藏而不是HVID?是的,您当然是对的,对此表示抱歉。现在它是正确的,但当然它仍然不起作用。不幸的是,这不起作用,因为它只返回一个历史记录中的controlId和值。如果您可以在上面的示例中看到,版本3 a3没有控件。版本2a2有两个ControlId的c1和c2,但版本1A1也有ControlId的c1。所以我只需要c1的控件和值,它有最高的历史版本。因此,如果我要求版本3,其中有controlid c2 b3和更高版本的c1,这是b2。像这样,我收到了错误。FROM子句中的对象历史和历史具有相同的公开名称。使用相关名称来区分它们。你能再帮我一次吗?非常感谢。像这样,版本不再相关了。因为hvid是guid,所以您确定使用maxHistoryvalues.hvid吗?版本在哪里?我需要问一下,例如,给我版本3的结果。您知道吗?您只需要记住,要插入的控件的最新版本是maxHistoryvalues.hvid,而不是对id进行排序?数据库本身是否正在查找insertdate?我不明白。如果我只需要版本3和更小版本的查询,而不是版本4、5、6等等,这是这样工作的吗?
Select HVID, ControlId, max(Version), Value from 
(   
    Select HVID, ControlId, Version, Value
    from History inner JOIN
         Historyvalues ON History.HID = Historyvalues.HID
    where Version <= 3  
) as a
group by ControlId
order by Version desc
 Select  Historyvalues.HVID,Historyvalues.ControlID,Historyvalues.Value
 from Historyvalues
 inner join History on Historyvalues.hid=History.hid
 where Historyvalues.hvid in (
            select MAX(Historyvalues.hvid) from Historyvalues
        inner join History on Historyvalues.hid=History.hid
        group by ControlID)
SELECT HVID, ControlId, Version, Value 
FROM
(   
    SELECT t2.HVID, t2.ControlId, t1.Version, t2.Value,
           ROW_NUMBER() OVER(PARTITION BY t2.ControlId ORDER BY t1.Version DESC) as rnk
    FROM History t1 
     JOIN Historyvalues t2 
      ON t1.HID = t2.HID
    WHERE t1.Version <= 3  
) AS a
WHERE a.rnk = 1
ORDER BY a.Version desc
| HVID | CONTROLID | VERSION |  VALUE |
|------|-----------|---------|--------|
|   b2 |        c1 |       2 | value2 |
|   b3 |        c2 |       2 | value3 |