Возвращает верхние N строк, упорядоченных по дате после объединения таблицы

#sql #ms-access #ms-access-2010

#sql #ms-access #ms-access-2010

Вопрос:

Несколько недель назад я опубликовал сообщение с проблемой, теперь я справился с этим и обнаружил новую потребность и новую проблему. Я использую access 2010, не уверен, какая версия базы данных, имею доступ к инструментам grunt для использования (например, без объектов). У меня есть запрос, который работает, он выглядит следующим образом. Цель этого запроса — использовать одну строку в качестве базовой и найти все связанные строки, которые следуют за ней в хронологическом порядке. Насколько я знаю, это может быть очень грубым решением.

 SELECT QueueA.cnlyMemberId, QueueA.updateUser AS 305UpdateUser, QueueA.updateDt AS 305UpdateDt, QueueB.statusCd
FROM (SELECT cnlyMemberID, updateUser, updateDt 
      FROM V_Queue_History
      WHERE statusCd = "305" AND
            V_Queue_History.updateDt Between [Enter Start Date:] And [Enter End Date: (must be at least one day apart)]
     ) AS QueueA INNER JOIN
     V_Queue_History AS QueueB
     ON (QueueA.cnlyMemberID = QueueB.cnlyMemberID AND
         QueueA.updateDt < QueueB.updateDt
        )
  

Теперь я хочу найти первые 305 statusCd и следующие statusCd в хронологическом порядке, а не все последующие statusCd. Сейчас я попробовал несколько вещей, в основном пытаясь взять ВЕРХНИЕ 2 с ПОРЯДКОМ ПО updateDt, указанным в условии ON. Затем я попытался заменить V_Queue_History таблицей и проделать то же самое, не сработало. Я только что попытался использовать условие where, где я проверяю, является ли

Включен идентификатор очереди.cnlyMemberId (ВЫБЕРИТЕ 2 верхних cnlylMemberID ИЗ условий очереди WHERE);

но по-прежнему ничего. Система сказала бы мне, что она больше не знает, что такое QueueB, поэтому ничего из этого не будет выполняться в операторе WHERE. Я хотел бы уточнить, но я только что допустил сбой Access, и мой разум начинает затуманиваться от того, насколько это может расстраивать. У меня вообще нет большого опыта работы с Access / SQL, и я в значительной степени изучаю его по ходу работы.

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

Спасибо!

Ответ №1:

Я не уверен, что вы хотите без образца вывода, возможно, что-то вроде этого помогло бы:

 SELECT QueueA.cnlyMemberId, QueueA.updateUser AS 305UpdateUser, QueueA.updateDt AS 305UpdateDt, QueueB.statusCd
FROM (SELECT cnlyMemberID, updateUser, updateDt 
      FROM V_Queue_History
      WHERE statusCd = "305" AND
            V_Queue_History.updateDt Between [Enter Start Date:] And [Enter End Date: (must be at least one day apart)]
     ) AS QueueA INNER JOIN
     V_Queue_History AS QueueB
     ON QueueA.cnlyMemberID = QueueB.cnlyMemberID
WHERE (QueueB.updateDt = 
   (SELECT Min(updateDt) FROM V_Queue_History V2
    WHERE V2.cnlyMemberID = QueueA.cnlyMemberID 
    AND V2.updateDt > QueueA.updateDt))
  

Это предполагает, что после 305 всегда есть код состояния, а также, что никакие две записи не имеют одинаковой даты обновления.

Если вам нужно получить верхние N кодов состояния после 305, вы могли бы изменить предложение WHERE следующим образом, хотя я не знаю, будет ли производительность достаточно хорошей для вашей ситуации:

 WHERE QueueB.updateDt IN 
   (SELECT TOP 5 updateDt FROM V_Queue_History V2
    WHERE V2.cnlyMemberID = QueueA.cnlyMemberID 
    AND V2.updateDt > QueueA.updateDt
    ORDER BY V2.updateDt)
  

Комментарии:

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

2. Что ж, это определенно похоже на то, что я хочу, мне нужно будет протестировать это подробнее. Чтобы было понятно, что вы не возражаете, кратко объяснив, что здесь делает функция Min ()?

3. Он получает самое раннее обновление, которое после 305 updateDt для определенного MemberID.

4. Я думаю, это имеет смысл. В случае, если мне понадобится немного больше данных, есть ли способ заставить их получить n как можно скорее, а не только первые? Я думаю, что это сработает иначе, но я просто хочу охватить основы. Спасибо за помощь!

5. Только что увидел обновление. Потрясающая вещь, спасибо! То, что вы опубликовали в редактировании, было тем, что я искал, но продолжал путать мои таблицы и псевдонимы. При этом производительность намного выше с первым, и у меня есть хорошая идея, как изменить его по своему усмотрению. Спасибо за вашу помощь!