【问题标题】:SQL - Increment after 5 rows ordered by dateSQL - 按日期排序 5 行后递增
【发布时间】:2020-07-21 22:43:45
【问题描述】:

我创建了一个表,其中包含一个名为date 的列。现在我需要找到一种方法来对结果集进行排序并添加一个新的 column,它仅在 5 个排序日期后递增。

例如

------------------------
| Date        | Number |
------------------------
| 01/jan/2020 | 1      |
| 02/jan/2020 | 1      |
| 05/jan/2020 | 1      |
| 07/jan/2020 | 1      |
| 10/jan/2020 | 1      |
| 11/jan/2020 | 2      |
| 11/jan/2020 | 2      |
| 12/jan/2020 | 2      |
------------------------

我正在使用 MySQL。

【问题讨论】:

  • date 列的数据类型是什么,这是字符串吗?
  • 可以为重复的日期分配不同的数字吗?

标签: mysql sql sql-order-by auto-increment


【解决方案1】:
SELECT *, (4 + ROW_NUMBER() OVER (ORDER BY `date`)) MOD 5 `number`
FROM sourcetable

【讨论】:

    【解决方案2】:

    您似乎将日期存储为字符串。你绝对应该修复这个设计缺陷。

    要对记录进行排序,您需要将字符串转换为日期。为此,您可以使用str_to_date()。您可以使用row_number() 和简单的算术来计算数字:

    select
        date,
        1 + floor((row_number() over(order by str_to_date(date, '%d/%b/%Y')) - 1) / 5) rn
    from mytable
    order by str_to_date(date, '%d/%b/%Y')
    

    在旧版本的 MySQL 中,您可以使用变量:

    select date, 1 + floor((@rn := @rn + 1) / 5) rn
    from (
        select date, str_to_date(date, '%d/%b/%Y') real_date
        from mytable
        order by real_date
    ) t
    cross join (select @rn := -1) x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2022-01-10
      相关资源
      最近更新 更多