考虑包含事件的表:
| 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->锦标赛位于第三位,但如果按日期排序,它在列表中的位置较晚
| 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->锦标赛排在第二位,因为日期已经很近了,按日期自然排序很好
| 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。
发布于 2018-10-19 02:02:00
你可以轻而易举地先做到:
select t.*
from t
order by (name = 'tournament')::int desc,
date;
让它排在第三位就有点棘手了。
发布于 2018-10-19 16:36:23
您可以在case表达式中使用row_number()
,如下所示:
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
https://stackoverflow.com/questions/52879960
复制相似问题