SQL: как выбрать только самую старую запись - PullRequest
0 голосов
/ 10 июня 2019

Я понимаю, что это вопрос, который задавался ранее, но после изучения этих постов, ни один из них не соответствует точно тому, над чем я работаю.

У меня есть список людей, которые посетили какое-то место,многие из которых посетили несколько раз.У каждого человека есть уникальный идентификатор, и у каждого посещения есть дата и статус (я смотрю только на посещения со статусом «без изменений», а не «отменен», «перенесен» и т. Д.).Что мне нужно сделать, это выбрать только самую старую запись для каждого человека.Другими словами, смотрите только дату их первого посещения.

Я уже решил такую ​​проблему, как раньше, и я вернулся, нашел свой старый код и попытался применить его к этой конкретной ситуации.Проблема в том, что в то время я пытался получить самую последнюю запись для данного человека, и я не уверен, как изменить то, что у меня здесь, чтобы применить к самой старой запись.Если у одного человека было 3 посещения, а у другого 7, я не знаю, что делать с моей переменной seqnum.

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

Есть мысли?

SELECT DISTINCT
  PersonID,
  PersonName,
  VisitDate,
  Status,
  VisitType

FROM (SELECT VisitInfo.*,
      ROW_NUMBER() OVER (PARTITION BY PersonID, VisitDate ORDER BY VisitDate DESC) as seqnum
      FROM VisitInfo
      WHERE Status = 'Unchanged'

      ) VisitInfo

WHERE seqnum = 1
ORDER BY VisitDate

Ответы [ 3 ]

4 голосов
/ 10 июня 2019

Вы не должны разбивать на VisitDate, потому что почти каждая строка имеет свой собственный раздел.

SELECT 
  PersonID,
  PersonName,
  VisitDate,
  Status,
  VisitType

FROM (SELECT VisitInfo.*,
      ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY VisitDate) as seqnum
      FROM VisitInfo
      WHERE Status = 'Unchanged'

      ) VisitInfo

WHERE seqnum = 1
ORDER BY VisitDate
1 голос
/ 11 июня 2019

Мне нравится ваша попытка и решение М. Канарковского, но здесь есть другая альтернатива.

SELECT     a.PersonID
         , a.PersonName
         , a.VisitDate
         , a.Status
         , a.VisitType
FROM       VisitInfo AS a
INNER JOIN (
               SELECT PersonID
                    , MIN(VisitDate) AS OldestVisitDate
               FROM   VisitInfo
               WHERE  Status = 'Unchanged'
           )         AS b ON a.PersonID = b.PersonID
                             AND a.VisitDate = b.OldestVisitDate
WHERE      a.Status = 'Unchanged';
0 голосов
/ 10 июня 2019

Возможно, попробуйте:

SELECT DISTINCT
      PersonID,
      PersonName,
      MIN(VisitDate) AS [First visit date],          
      VisitType    
FROM 
    VisitInfo
WHERE 
    Status = 'Unchanged'
GROUP BY
    PersonID,
    PersonName,        
    VisitType 

Не проверено!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...