我如何分组,排序和取出mysql中的第一个N?
Posted
技术标签:
【中文标题】我如何分组,排序和取出mysql中的第一个N?【英文标题】:how do I group, sort and take out the first N in mysql? 【发布时间】:2019-10-17 02:37:52 【问题描述】:可以得到分组中排序后的数据,最后取出DolphinDB中的前N个。
但是如何分组、排序和取出mysql中的前N个呢?
先谢谢你。
DolphinDB代码如下:
sym = `C`MS`MS`MS`IBM`IBM`C`C`C$symbol;
price= 49.6 29.46 29.52 30.02 174.97 175.23 50.76 50.32 51.29;
qty = 2200 1900 2100 3200 6800 5400 1300 2500 8800;
timestamp = [09:34:07,09:36:42,09:36:51,09:36:59,09:32:47,09:35:26,09:34:16,09:34:26,09:38:12];
t1 = table(timestamp, sym, qty, price);
select top 2 * from t1 context by sym csort timestamp;
timestamp sym qty price
--------- --- ---- ------
09:34:07 C 2200 49.6
09:34:16 C 1300 50.76
09:32:47 IBM 6800 174.97
09:35:26 IBM 5400 175.23
09:36:42 MS 1900 29.46
09:36:51 MS 2100 29.52
【问题讨论】:
您到底想做什么?您可以使用GROUP BY
进行分组,使用ORDER BY
进行排序并使用LIMIT
取出第一个N
【参考方案1】:
SELECT sym, sum(qty) FROM table_name GROUP BY sym ORDER BY qty LIMIT 5;
在哪里
GROUP BY
列 - 对行进行分组
ORDER BY
列 - 订单行
LIMIT
number - 选择第一个行数
【讨论】:
【参考方案2】:如果你有支持ROW_NUMBER()
的 MySQLv8.0,你可以使用这样的东西:
SELECT `timestamp`,sym,qty,price
FROM
(
SELECT
`timestamp`,sym,qty,price,ROW_NUMBER() OVER (PARTITION BY sym ORDER BY timestamp ASC) AS ranking
FROM `table`
) t
WHERE ranking<3
https://www.db-fiddle.com/f/8fY2DJmCCv7kCnEAPBAU3B/0
【讨论】:
我很好奇这个包含子查询的sql语句的性能和执行计划。如果 MySQL 先执行子查询,然后按 'ranking' 列过滤行,性能可能会很差。以上是关于我如何分组,排序和取出mysql中的第一个N?的主要内容,如果未能解决你的问题,请参考以下文章
如何获得groupby结果里面第一个分组的第一条数据List<t
取出分组后每组的第一条记录(不用group by)按时间排序