sql - 使用 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 行的日期
解决方案
没有这样的事情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
推荐阅读
- arrays - 如何将对象数组作为道具传递给反应原生的自定义组件?
- c++ - 在 C++ 中实现方法的这种方式是什么?
- python - 倒数计时器未从给定值开始
- c# - 有没有办法统一找到从广告中赚到的钱
- shell - 如何仅在unix文件的第一行中搜索单词
- javascript - 如何在 Javascript 中做到这一点
- ruby-on-rails - 如何使用 Rails 中的固定装置测试 has_many :through 关联?
- python - RuntimeError("grad 只能为标量输出隐式创建")
- javascript - 在个人资料图片 Firebase Web Realtime-Database 下显示名称
- c# - 使用 C# 中的 NAudio 将 M4A 音频文件转换为 MP3 的问题/错误