Слишком много данных с использованием DISTINCT MAX - PullRequest
0 голосов
/ 17 мая 2019

Я хочу видеть последнее действие каждой отдельной трубки и пользователя, который использовал эту трубку. У меня есть таблица UserSessions, в которой хранится информация о последней активности конкретного пользователя, а также о том, какую трубку они использовали в этой активности. Примерно 40 трубок, но я всегда получаю слишком много записей, например, 10000 строк, когда мне нужно только последнее действие каждой трубки. Что я делаю не так?

SELECT DISTINCT MAX(UserSessions.LastActivity), Handsets.Name,Users.Username
FROM UserSessions
INNER JOIN Handsets on Handsets.HandsetId = UserSessions.HandsetId
INNER JOIN Users on Users.UserId = UserSessions.UserId 
WHERE 
Handsets.Name in (1000,1001.1002,1003,1004....)
AND Handsets.Deleted = 0
GROUP BY UserSessions.LastActivity, Handsets.Name,Users.Username 

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

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Нет такой вещи как DISTINCT MAX.У вас есть SELECT DISTINCT, который гарантирует, что все столбцы, на которые есть ссылки в SELECT, не дублируются (как группа) в нескольких строках.И есть MAX() функция агрегирования.

Как примечание: SELECT DISTINCT почти никогда не подходит для GROUP BY.

Вы, кажется, хотите:

SELECT *
FROM (SELECT h.Name, u.Username, MAX(us.LastActivity) as last_activity,
             RANK() OVER (PARTITION BY h.Name ORDER BY MAX(us.LastActivity) desc) as seqnum
      FROM UserSessions us JOIN
           Handsets h
           ON h.HandsetId = us.HandsetId INNER JOIN
           Users u
           ON u.UserId = us.UserId 
      WHERE h.Name in (1000,1001.1002,1003,1004....) AND
            h.Deleted = 0
      GROUP BY h.Name, u.Username 
     ) h
WHERE seqnum = 1
0 голосов
/ 17 мая 2019

Вы обычно GROUP BY те же столбцы, что и вы SELECT, за исключением тех, которые являются аргументами для установки функций.

Этот GROUP BY не возвращает дубликатов, поэтому SELECT DISTINCT не требуется.

SELECT MAX(UserSessions.LastActivity), Handsets.Name, Users.Username
FROM UserSessions
INNER JOIN Handsets on Handsets.HandsetId = UserSessions.HandsetId
INNER JOIN Users on Users.UserId = UserSessions.UserId 
WHERE Handsets.Name in (1000,1001.1002,1003,1004....)
  AND Handsets.Deleted = 0
GROUP BY Handsets.Name, Users.Username 
...