我有这个文件表(这里是简化版):
+------+-------+--------------------------------------+
| id | rev | content |
+------+-------+--------------------------------------+
| 1 | 1 | ... |
| 2 | 1 | ... |
| 1 | 2 | ... |
| 1 | 3 | ... |
+------+-------+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)
如何为每个id选择一行并且只选择最大转速?
使用上面的数据,结果应该包含两行:[1, 3, ...]和[2, 1, ..].我正在使用MySQL.
目前,我在while循环中使用检查来检测并覆盖结果集中的旧转速.但这是实现结果的唯一方法吗?是不是有SQL解决方案?
更新
作为答案提示,有是一个SQL的解决方案,并且这里sqlfiddle演示.
更新2
我注意到在添加上述sqlfiddle之后,问题被投票的速率超过了答案的upvote率.那不是故意的!小提琴是基于答案,特别是接受的答案.
mysql sql aggregate-functions greatest-n-per-group groupwise-maximum
在我的系统中,我有客户.客户有程序.我想显示一个客户列表,显示它们最近的活动(如果存在)程序.
因此,我们有这样的事情:
SELECT *
FROM clients AS client
JOIN programs AS program ON client.id=program.client_id
GROUP BY client.id
ORDER BY program.close_date=0 DESC, program.close_date DESC
Run Code Online (Sandbox Code Playgroud)
close_date=0表示该程序未关闭.因此,它将把非封闭程序放在第一位,然后是最近关闭的程序.
问题是,订单在组内不起作用.它只是随机选择其中一个程序.我该如何解决这个问题?
刚想出来:
SELECT *
FROM clients AS client
JOIN (SELECT * FROM programs AS program ORDER BY program.close_date=0 DESC, program.close_date DESC) AS program ON client.id=program.client_id
GROUP BY client.id
Run Code Online (Sandbox Code Playgroud)
这似乎给出了正确的结果.这是正确的,还是我很幸运?也就是说,我在加入之前基本上对表格进行了排序; 这些结果会像加入一样保持排序,对吧?
解决方案:我现在相信这是一个典型的分组最大问题.如果您遇到类似问题,请搜索该问题.该解决方案涉及两次加入同一个表.
嘿所有,我有一个需要优化的查询.它有效,但它是一只狗,性能明智.
它看起来像这样:
SELECT *
FROM (
SELECT *
FROM views
WHERE user_id = '1'
ORDER BY
page DESC
) v
GROUP BY
v.session
Run Code Online (Sandbox Code Playgroud)
我正在跟踪不同页面的视图,我想知道每个会话的最高页面,以便知道他们在任何给定的时间点击了多远(他们需要一直查看每个页面)会话.
基本上我要做的是在GROUP之前对结果进行排序.以上实现了这一点,成本很高.
任何人都可以拍我的头脑怎么做?多谢你们!
更新:
解释:
"1" "PRIMARY" "<derived2>" "ALL" \N \N \N \N "3545" "Using temporary; Using filesort"
"2" "DERIVED" "views" "index" \N "page" "5" \N "196168" "Using where"
Run Code Online (Sandbox Code Playgroud)
架构:
ID int(8) unsigned (NULL) NO PRI (NULL) auto_increment select,insert,update,references
page int(8) (NULL) YES MUL (NULL) select,insert,update,references
user_id int(8) (NULL) YES (NULL) select,insert,update,references
session int(8) (NULL) YES (NULL) …Run Code Online (Sandbox Code Playgroud)