Выпуск выводит наиболее опытные ценности - PullRequest
0 голосов
/ 20 февраля 2019

Совершенно новый для SQL.

Я пытаюсь вывести наиболее часто используемое приложение пользователем за 2018. Версия: MySQL v5.7

Отношения:

  • пользователь (UID: INT PRIMARY KEY, UNAME VARCHAR (100), LOCATION VARCHAR (100))
  • приложение (AID: INT PRIMARY KEY, DID: INT NOT NULL, AppName VARCHAR (100), versionDate DATE)
  • UseHistory (AID: INT NOT NULL, UID: INT NOT NULL, useDate DATE NOT NULL)

Моя текущая попытка выдает Invalid Use of Group Function исключение

SELECT user.UID, application.AID
FROM user
INNER JOIN usageHistory ON usageHistory.UID = user.UID
INNER JOIN application ON application.AID = usageHistory.AID
WHERE YEAR(usageHistory.usageDate) = 2018
GROUP BY user.UID
HAVING MAX(COUNT(usageHistory.AID))

Я хочу отобразить имя пользователя |Наиболее часто используемое приложение для 2018.
Пример:

  • Стив Смит |Facebook
  • Джейн Смит |Twitter

(Трубы предназначены исключительно для визуализации)

1 Ответ

0 голосов
/ 20 февраля 2019

В MySQL 8+ вы можете использовать ROW_NUMBER():

SELECT UID, AID
FROM (SELECT uh.UID, uh.AID,
             ROW_NUMBER() OVER (PARTITION BY uh.UID ORDER BY COUNT(*) DESC) as seqnum
      FROM usageHistory uh
      WHERE uh.usageDate >= '2018-01-01' AND uh.usageDate < '2019-01-01'
      GROUP BY u.UID, a.AID
     ) ua
WHERE seqnum = 1;

Примечания:

  • Нет необходимости присоединяться к users или applications.Идентификаторы, которые вы хотите, находятся в usageHistory.
  • Попробуйте использовать прямые сравнения дат.Это облегчает оптимизацию запроса.
  • Псевдонимы таблиц облегчают написание и чтение запроса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...