TSQL-Join на собственной таблице, выбирая только последнюю строку - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть таблица tbl_Partner (сокращенная) с двумя «дублирующимися» партнерами:

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.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011
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 имеет только одна строка. Если нет, добавьте дополнительное условие в объединение между t1 и t2, чтобы UpdateCounter было выше на t2.

Два внешних соединения должны обеспечивать, чтобы не было более ранней строки, чем t1 (t1_anti), и не более поздней строки, чем t2 (t2_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 голосов
/ 06 мая 2014

Выберите Max 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...