首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将某些行放在结果集中的特定位置

如何将某些行放在结果集中的特定位置
EN

Stack Overflow用户
提问于 2018-10-19 02:00:15
回答 2查看 35关注 0票数 0

考虑包含事件的表:

代码语言:javascript
运行
复制
| date         | name       | wanted position| 
----------------------------------------
| 01.01.2001   | game       | 
| 01.02.2001   | game       | 
| 01.03.2001   | game       | 
| 01.04.2001   | game       | 
| 01.05.2001   | tournament | 3
| 01.06.2001   | game       | 

现在,我从按日期排序的表中获取事件。运行良好,但对于大量的行数,锦标赛在列表的末尾。所以,没有人真正看到它。为了解决这个问题,如果锦标赛日期在所需位置上的实际事件日期之后,我希望将锦标赛始终放在结果集中的第三(或任何其他任意位置,视情况而定)位置。

例如,以下是我想要的结果集:

1->锦标赛位于第三位,但如果按日期排序,它在列表中的位置较晚

代码语言:javascript
运行
复制
| date         | name       | wanted position| 
----------------------------------------
| 01.01.2001   | game       | 
| 01.02.2001   | game       | 
| 01.05.2001   | tournament | 3
| 01.03.2001   | game       | 
| 01.04.2001   | game       | 
| 01.06.2001   | game       | 

2->锦标赛排在第二位,因为日期已经很近了,按日期自然排序很好

代码语言:javascript
运行
复制
| date         | name       | wanted position| 
----------------------------------------
| 01.04.2001   | game       | 
| 01.05.2001   | tournament | 3
| 01.06.2001   | game       | 
| 01.07.2001   | game       | 
| 01.08.2001   | game       | 

这在SQL中是可行的吗?数据库为postgresql。

EN

回答 2

Stack Overflow用户

发布于 2018-10-19 02:02:00

你可以轻而易举地先做到:

代码语言:javascript
运行
复制
select t.*
from t
order by (name = 'tournament')::int desc,
         date;

让它排在第三位就有点棘手了。

票数 0
EN

Stack Overflow用户

发布于 2018-10-19 16:36:23

您可以在case表达式中使用row_number(),如下所示:

代码语言:javascript
运行
复制
SELECT
    date, name
FROM (
    SELECT
        date
      , name
      , CASE
            WHEN name = 'tournament' THEN 3
            ELSE ROW_NUMBER() OVER (ORDER BY date DESC)
        END rn
    FROM mytable
) d
order by rn, name DESC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52879960

复制
相关文章

相似问题

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