Mysql 如何在一次查询中先按A列排序,返回top-3,然后按B列排序结果?
(请参阅此职位的工作示例) 我有一个包含股票信息的表格,如下所示:Mysql 如何在一次查询中先按A列排序,返回top-3,然后按B列排序结果?,mysql,Mysql,(请参阅此职位的工作示例) 我有一个包含股票信息的表格,如下所示: sp100_id _date bullishness agreement ---------------------------------------------- 1 2011-03-16 1.01 0.33 1 2011-03-17 0.85 1.28 1 2011-03-18 0.89
sp100_id _date bullishness agreement
----------------------------------------------
1 2011-03-16 1.01 0.33
1 2011-03-17 0.85 1.28
1 2011-03-18 0.89 1.25
1 2011-03-21 1.46 1.21
1 2011-03-22 0.39 2.53
2 2011-03-16 3.07 1.27
2 2011-03-17 2.09 0.80
2 2011-03-18 0.91 0.12
2 2011-03-21 1.50 0.00
2 2011-03-22 2.62 1.10
3 2011-03-16 0.73 1.13
3 2011-03-17 1.13 1.21
3 2011-03-18 1.12 0.45
3 2011-03-21 1.00 1.01
3 2011-03-22 1.00 0.53
4 2011-03-16 0.40 1.10
4 2011-03-17 2.40 0.03
4 2011-03-18 3.16 0.10
4 2011-03-21 0.86 0.50
4 2011-03-22 1.00 0.10
我需要将这些公司(sp100_id
)按其平均值看涨
分为前三名:
SELECT
sp100_id,
AVG(bullishness) as bullishness,
AVG(agreement) AS agreement
FROM stocks
WHERE _date BETWEEN '2011-03-16' AND '2011-03-22'
GROUP BY sp100_id LIMIT 3
这很好,因为结果是
SP100_ID BULLISHNESS AGREEMENT
2 2.038 0.658
4 1.564 0.366
3 0.996 0.866
现在我有了前三名,我需要按照协议重新订购前三名,升序:
SP100_ID BULLISHNESS AGREEMENT
4 1.564 0.366
2 2.038 0.658
3 0.996 0.866
一个查询就可以做到这一点吗?我尝试了以下方法,但没有成功。它仍然只是通过看涨来下单
SELECT
sp100_id,
AVG(bullishness) as bullishness,
AVG(agreement) AS agreement
FROM stocks
WHERE _date BETWEEN '2011-03-16' AND '2011-03-22'
GROUP BY sp100_id
ORDER BY bullishness DESC, agreement ASC LIMIT 3
因此要明确的是:(1)我需要找到平均牛脾气最高的前三名公司(2)这三名公司需要从最低到最高的协议进行订购。最好有一个查询。您知道怎么做吗?它被称为结构化查询语言,因为您可以构建查询(又称虚拟表)嵌套在其他查询中的结构
以您的第一个查询为例,它是正确的,只是它需要自己的ORDERBY子句,然后将其嵌套在另一个查询中,如下所示
SELECT *
FROM (
SELECT sp100_id,
AVG(bullishness) as bullishness,
AVG(agreement) AS agreement
FROM stocks
WHERE _date BETWEEN '2011-03-16' AND '2011-03-22'
GROUP BY sp100_id
ORDER BY bullishness DESC
LIMIT 3
) subquery
ORDER BY agreement ASC
去拉小提琴: