2011-09-27 45 views
0

我有一个表tbl_Partner(缩短)“重复”的合作伙伴:TSQL-加入,有两个选择最新的行只

RecordID (GUID) | RISEID (varchar(40)) | UpdateCounter(int) | etc. ... 
----------------------------------------------------------- 
12345678-9012-3456-7890-123456789012 | RISE123 | 0 
87564321-9012-3456-7890-123456789012 | RISE123 | 1 
-- other partners with different updatecounters etc. 

现在我需要它有最新数据为每个合作伙伴视图(最高UpdateCounter),但第一的recordId(最低UpdateCounter)

我想这已经SQL:

select 
(select top 1 recordid from tbl_partner p2 where p2.riseid=p1.riseid order by p2.updatecounter ASC) as RecordID 
, riseid, updatecounter 
from tbl_partner p1 
order by riseid 

我得到:

RecordID (GUID) | RISEID (varchar(40)) | UpdateCounter(int) 
----------------------------------------------------------- 
12345678-9012-3456-7890-123456789012 | RISE123 | 0 --(old data) 
12345678-9012-3456-7890-123456789012 | RISE123 | 1 --(new correct data with the first RecordID) 
-- other rows/columns omitted 

如何才能为每个RecordID/RiseID选择最新的行? (在这个例子中UpdateCounter = 1)

备案: UpdateCounter可以是别的不是1,当然还有其他数据集具有不同的值。所以我不能使用简单的WHERE updatecounter>0

+0

什么是你需要的输出是什么样子?请给我们更多的样品数据 – gbn

回答

2
SELECT t1.RecordID,t1.RISEID,t2.UpdateCounter 
FROM 
    tbl_Partner t1 
     inner join 
    tbl_Partner t2 
     on 
      t1.RISEID = t2.RISEID 
     left join 
    tbl_Partner t1_anti 
     on 
      t1.RISEID = t1_anti.RISEID and 
      t1_anti.UpdateCounter < t1.UpdateCounter 
     left join 
    tbl_Partner t2_anti 
     on 
      t1.RISEID = t2_anti.RISEID and 
      t2_anti.UpdateCounter > t2.UpdateCounter 
where 
    t1_anti.RISEID is null and 
    t2_anti.RISEID is null 

,如果你想行出现,其中只有一行具有特定RISEID项目目前尚不清楚。如果不是,则在t1t2之间的连接中添加一个额外条件,使得UpdateCountert2上更高。

两个外连接,以确保有没有更早的行比t1t1_anti)和最迟行比t2t2_anti)。在WHERE条款中,我们确保这些连接不成功。


备选之一,采用稍微现代的风格:

;With OrderedRows as (
    Select RecordID,RISEID,UpdateCounter, 
     ROW_NUMBER() OVER (PARTITION BY RISEID ORDER BY UpdateCounter ASC) as rnEarly, 
     ROW_NUMBER() OVER (PARTITION BY RISEID ORDER BY UpdateCounter DESC) as rnLate 
    from tbl_Partner 
) 
SELECT t1.RecordID,t1.RISEID,t2.UpdateCounter 
FROM 
    OrderedRows t1 
     inner join 
    OrderedRows t2 
     on 
      t1.RISEID = t2.RISEID 
WHERE 
    t1.rnEarly = 1 and 
    t2.rnLate = 1 

这可能需要在桌子上较少的扫描。

+0

第一次尝试时看起来正确。我需要所有拥有不同RiseID的合作伙伴。对于具有最新数据行的每个合作伙伴应该只有一行,但是第一个数据行的RecordID。 –

+1

几乎写完你的第二个解决方案。该部分+1 –

0

选择最大UpdateCounter

select distinct(
(select top 1 recordid from tbl_partner p2 where p2.riseid=p1.riseid p2.updatecounter ASC 
))as RecordID,(select Max(updatecounter) from tbl_partner p2 where p2.riseid=p1.riseid ) as MaxUpdateCounter , riseid from tbl_partner p1