首页 > 解决方案 > 如果计划 1 年,每天取 3 行

问题描述

我有一张表圣经,它有两列 id、chample_name 及其如下所示:-

id     chapter_name  
365      chapter_1    
366      chapter_2
367      chapter_3
368      chapter_4
369      chapter_5
370      chapter_6
...       ....
1456    chater_1092

Total Records 1092 和 id 将从 365 开始到 1465 固定。现在用户每天将阅读 3 章。假设调度从今天开始,即2020 年 2 月 23 日2021 年 2 月 20 日。因此,用户要求 2020 年 2 月 23 日将出现 3 章,2020 年 2 月 24 日将出现下 3 章,依此类推。

id     chapter_name        date
365      chapter_1       2020-02-23    
366      chapter_2       2020-02-23
367      chapter_3       2020-02-23
368      chapter_4       2020-02-24
369      chapter_5       2020-02-24
370      chapter_6       2020-02-24
...       ....
1454    chater_1090      2021-02-20
1455    chater_1091      2021-02-20
1456    chater_1092      2021-02-20

所以现在假设今天是 2020 年 2 月 24 日,用户将在应用程序中看到第4 章、第 5 章、第 6 章。注意:-我不想在表中存储日期列。原因是我需要每年更新日期列。任何人都可以帮助我如何每天获取 3 条记录。所以我对 2020 年 2 月 24 日的预期产出

id     chapter_name        date
368      chapter_4       2020-02-24
369      chapter_5       2020-02-24
370      chapter_6       2020-02-24    

标签: mysqlsql

解决方案


您可以使用dense_rank()和算术将行分成 3 组:

select b.*,
       ceiling(dense_rank() over (order by id) / 3)
from bibles b

那么问题是如何获取日期。根据您的示例,这可能是:

select b.*,
       '2020-02-23' + interval ( ceiling(dense_rank() over (order by id) / 3) - 1) day
from bibles b;

但是,这- 1取决于结果集中的第一行是什么。如果您希望它从 365 开始,那么:

select b.*,
       '2020-02-23' + interval ( ceiling(dense_rank() over (order by id) / 3) - 1) day
from bibles b
where id >= 365;

推荐阅读