SQL热题266难!!!求解答!!

标准答案是这样的:

select u.name, c.name, l.date from

user as u join login as l on u.id = l.user_id

join client as c on c.id = l.client_id

where (l.user_id, l.date) in

(  

    select user_id, max(date) from login

    group by user_id

)

group by u.name, c.name, l.date

order by u.name ASC

那么为什么下面这样的解法就是错误的呢?

select u.name as u_n, c.name as c_n, max(l.date) as d from

login as l join user as u on l.user_id=u.id

join client as c on l.client_id=c.id

group by u.name

order by u.name asc

#笔试#
全部评论
用户的SQL查询存在两个关键问题,导致无法准确获取每个用户最近登录的设备信息: 1. 分组逻辑错误导致设备信息不准确 当前查询直接对`u.name`分组,但`client_id`未参与分组。当用户在同一天用不同设备登录时,会随机返回一个设备名称(如示例中fh在2020-10-13可能用ios和pc两种设备登录,但查询只会显示其中一个)。 错误示例: ```sql GROUP BY u.name -- 错误的分组字段 ``` 2. 未关联最近日期对应的设备信息 `MAX(date)`只能获取最近日期,但未明确该日期对应的`client_id`。正确做法需要先找到每个用户最近登录的完整记录(含日期和设备),再关联设备名称。 --- ### 修正后的SQL方案 ```sql SELECT u.name AS u_n, c.name AS c_n, l.date FROM ( SELECT user_id, client_id, date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY date DESC) AS rn FROM login ) AS l JOIN user AS u ON l.user_id = u.id JOIN client AS c ON l.client_id = c.id WHERE l.rn = 1 ORDER BY u.name ASC;
点赞 回复 分享
发布于 04-01 17:55 上海

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务