WITH TIES не фильтрует записи по типам записей - PullRequest
0 голосов
/ 08 апреля 2020

Я написал sql, чтобы получить последнюю запись, основанную на версии. Он вытягивает последнюю запись, но я должен убедиться, что он вытягивает последнюю запись каждого типа. Тип определяется AgreementId. Как вы можете видеть на снимке ниже, есть две записи с разными идентификаторами соглашения. Я пытаюсь использовать связи, но это не похоже на работу. Что я делаю не так

Это текущие записи

enter image description here

Приведенный ниже запрос получает только одну запись, которая является последним соглашением от две записи. В идеале он должен возвращать оба, поскольку они являются двумя типами соглашения. Я использую WITH TIES, но это не похоже на то, что я хочу

  SELECT TOP (1) WITH TIES  ua.ID AS UserAgreementID ,
         A.ID AS AgreementID ,
         A.Code ,
         A.ComplianceCode ,
         A.Name ,
         A.Description ,
         A.Version ,
         ua.UserAgreementStateID ,
         uas.Name AS UserAgreementStateName ,
         ua.AcceptanceWindowExpiry ,
         declaration.GetDifferenceInDaysOrHours(ua.AcceptanceWindowExpiry) AS TimeLeft ,
         A.Data ,
         pa.ID AS AuthoredByID ,
         pa.FirstName + ' ' + pa.LastName AS AuthoredByName ,
         A.Authored ,
         ia.ID AS IssuedByID ,
         ia.FirstName + ' ' + pa.LastName AS IssuedByName ,
         A.Issued
  FROM declaration.Agreement AS A
  INNER JOIN declaration.UserAgreement AS ua ON A.ID = ua.AgreementID
  INNER JOIN declaration.UserAgreementState AS uas ON ua.UserAgreementStateID = uas.ID
  LEFT JOIN common.Person AS pa ON A.AuthoredBy = pa.ID
  LEFT JOIN common.Person AS ia ON A.IssuedBy = ia.ID WHERE ua.UserID = 607
  AND uas.Code IN ('ISS',
                   'DEF','EXP')-- Issued, Deferred

  AND A.Draft = CONVERT(BIT, 0) -- Not a draft.

  AND A.Deleted = CONVERT(BIT, 0) -- Not deleted.

  AND (A.Issued <= GETUTCDATE()
       OR A.Issued IS NULL)
  AND (A.Expires > GETUTCDATE()
       OR A.Expires IS NULL)
ORDER BY A.Version DESC

1 Ответ

0 голосов
/ 08 апреля 2020

Я думаю, что вы хотите:

ORDER BY ROW_NUMBER() OVER(PARTITION BY A.AgreementID ORDER BY A.Version DESC)

Функция row_number() ранжирует записи с одинаковым AgreementID по убыванию Version. Другими словами, для каждого AgreementID функция присваивает ранг 1 записи, которая имеет наибольшее значение Version. Затем TOP (1) WITH TIES фильтрует все записи, которые находятся на первом месте.

...