【问题标题】:Too much Data using DISTINCT MAX使用 DISTINCT MAX 的数据过多
【发布时间】:2019-05-17 13:37:41
【问题描述】:

我想查看每部手机和使用该手机的用户的最后一次活动。我有一张表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 行的日期

【问题讨论】:

  • 这是因为一个手机可能被多个用户使用,并且当您按用户分组时,您将获得手机和用户明智的最后操作详细信息。

标签: sql max sql-server-2014 distinct multiple-select


【解决方案1】:

您通常 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 

【讨论】:

  • 感谢 Jarlh!,k 只带回了大约 1000 行。我认为这是因为不同的用户使用相同的手机?我只想要每部手机的最后一个活动(只有一个记录)。还有其他想法可以简化查询吗?
  • 您是否也想要上次活动的用户名(每个手机)? (如果不需要,只需从 SELECT 列表和 GROUP BY 子句中删除 Users.Username。)
  • 是的,我需要用户名来找出最后拥有它的人。
【解决方案2】:

没有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

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多