SQL Server 获取第一个匹配的值

4
我有两个表格:History和Historyvalues:

History

HID(uniqeidentifier) | Version(int)
a1 | 1
a2 | 2
a3 | 3
a4 | 4

历史价值

HVID(uniqeidentifier) | HID(uniqeidentifier) | ControlID(uniqeidentifier) | Value(string) 
b1 | a1 | c1 | value1 
b2 | a2 | c1 | value2 
b3 | a2 | c2 | value3

现在我需要一个查询,可以获取特定版本中每个控件的最后一个历史值列表,例如:
从版本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

但是这并不起作用。
有什么想法吗?
非常感谢您的帮助。
最好的问候。

“Historyvalues ON History.HID = Historyvalues.HVID” 应该是 HID 而不是 HVID 吗? - ta.speot.is
是的,当然你是对的,很抱歉。现在它是正确的,但是当然它仍然不能工作。 - Marc
2个回答

1

根据您指定的版本,获取每个控件的最新版本(WHERE t1.Version <= 3

查询:

SQLFIDDLE示例

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 |

0

这是您的解决方案

 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)

很遗憾,这不起作用,因为它仅返回一个历史 HID 中 controlId 和值。如果您可以看到上面的示例,版本 3(a3)没有控件。版本 2(a2)有两个 ControlId:c1 和 c2,但是版本 1(a1)也有 controlId c1。因此,我只需要具有最高历史版本的 c1 的 controlId 和值。因此,如果我要求版本 3,则其中有控件 ID c2(b3),并且 c1 的更高版本是 b2。 - Marc
就像这样,我收到了错误信息:“FROM子句中的对象“History”和“History”具有相同的公开名称。使用关联名称来区分它们。”你能再帮我解决一下吗?非常感谢。 - Marc
就像这样,版本不再相关。您确定max(Historyvalues.hvid)吗?因为hvid是一个guid。版本在哪里?我需要问一下,例如给我版本3的结果。您有任何想法吗? - Marc
请注意,您要插入的最新版本控件应放在最后。 - Aijaz Chauhan
max(Historyvalues.hvid)是否没有对ID进行排序?数据库本身是否在寻找插入日期?我不明白这一点。如果我只需要查询版本3及更低版本(而不是版本4、5、6等),这样做可以吗? - Marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接