MySQL внутреннее соединение только выберите 1 строку - PullRequest
0 голосов
/ 22 января 2019

У меня есть таблица (sampleTable) дат доступа к веб-сайту в виде года-месяца-дня, временных меток в виде года-месяца-дня, часов-минут-секунд, идентификаторов пользователей и идентификаторов доступа к веб-сайту.Я хочу выбрать идентификаторы доступа, которые соответствуют первому доступу, произошедшему в самый последний день.До сих пор я пытался сделать это с

select userID, MAX(dayAccessed) as latestDay from sampleTable group by userID;

, который возвращает самый последний день.Затем я использовал это во внутреннем объединении, чтобы объединить этот запрос с исходной таблицей, которая правильно упорядочивает столбцы.Моя проблема в том, что я не могу получить доступ к самому раннему идентификатору доступа за самый последний день для обоих идентификаторов пользователей, так как

SELECT sampleTable.dayTimeAccessed, sampleTable.userID, latest.latestDay 
FROM 
    (SELECT userID, MAX(dayTimeAccessed) AS latestDay 
    from sampleTable 
    group by userID) AS latest 
INNER JOIN sampleTable 
ON sampleTable.userID = latest.userID AND 
    sampleTable.dayTimeAccessed 
limit 1;

возвращает только одно поле с первым идентифицированным идентификатором пользователя.

1 Ответ

0 голосов
/ 22 января 2019

Сначала необходимо найти МАКСИМАЛЬНУЮ дату, а затем отметку времени MIN:

SELECT 
   min(sampleTable.dayTimeAccessed) -- min timestamp per user for the MAX date
  ,latest.userID
  ,latest.latestDay 
FROM 
  ( SELECT userID, MAX(dayAccessed) AS latestDay  -- max date per user
    from sampleTable 
    group by userID
  ) AS latest 
INNER JOIN sampleTable 
ON sampleTable.userID = latest.userID
AND sampleTable.dayAccessed = latest.latestDay
GROUP BY latest.userID, latest.latestDay

Для MySQL 8 вы можете использовать ROW_NUMBER:

SELECT *
FROM
 (
   SELECT *, 
      ROW_NUBMER() -- min timestamp per user for the MAX date
      OVER (PARTITION BY userID
            ORDER BY dayAccessed DESC, dayTimeAccessed ASC) AS rn
   FROM sampleTable
 ) t
WHERE rn = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...