首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一个查询中先按列A排序,返回一个top-3,然后再按列B排序?

如何在一个查询中先按列A排序,返回一个top-3,然后再按列B排序?
EN

Stack Overflow用户
提问于 2012-09-02 19:16:01
回答 1查看 33关注 0票数 3

(有关本文的工作示例,请参阅SQLFiddle )

我有一个包含股票信息的表,如下所示:

代码语言:javascript
复制
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)按其随着时间推移的平均bullishness排在前3位:

代码语言:javascript
复制
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

这可以很好地工作,因为结果是

代码语言:javascript
复制
SP100_ID    BULLISHNESS AGREEMENT
2           2.038           0.658
4           1.564           0.366
3           0.996           0.866

现在我有了前3名,我需要按AGREEMENT升序对前3名进行重新排序:

代码语言:javascript
复制
SP100_ID    BULLISHNESS AGREEMENT
4           1.564           0.366
2           2.038           0.658
3           0.996           0.866

一个查询就可以做到这一点吗?我尝试了以下方法,但不起作用。它仍然只按bullishness订购

代码语言:javascript
复制
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)我需要找到平均看涨程度最高的前3家公司(2)这3家公司需要从最低到最高的一致性排序。优选地,使用一个查询。你知道怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-02 19:53:07

它被称为结构化查询语言,因为您可以构建将查询(也称为虚拟表)嵌套在其他查询中的结构。

第一个查询是正确的,但它需要自己的ORDER BY子句,并将其嵌套在另一个查询中,如下所示。

代码语言:javascript
复制
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

去拉小提琴:http://sqlfiddle.com/#!2/c9ff0/7/0

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12235509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档