首页 > 解决方案 > 使用 DISTINCT MAX 的数据过多

问题描述

我想查看每部手机和使用该手机的用户的最后一次活动。我有一个表格UserSessions,其中存储了特定用户的最后一次活动以及他们在该活动中使用的手机。大约有 40 部手机,但我总是返回太多记录,比如 10,000 行,而我只想要每部手机的最后一次活动。我究竟做错了什么?

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 行的日期

标签: sqlmaxsql-server-2014distinctmultiple-select

解决方案


没有这样的事情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

推荐阅读