【问题标题】:row number in sql -keep it same for change in valuesql中的行号-保持相同以更改值
【发布时间】:2020-12-21 20:13:23
【问题描述】:

我有一个 SQL 问题:我想将每条记录的排名填充为下一个数字。但是,对于调整值不同的记录,我想保持排名相同。

样本数据:

# | value | date1      | * rank (expected)
--+-------+------------+-------
1 | A     | 05/01/2020 |    1
1 | A     | 05/02/2020 |    2
1 | A     | 05/03/2020 |    3
1 | B     | 05/04/2020 |    3
1 | A     | 05/05/2020 |    3
1 | A     | 05/06/2020 |    4
1 | A     | 05/07/2020 |    5
1 | A     | 05/08/2020 |    6
1 | B     | 05/09/2020 |    6
1 | A     | 05/10/2020 |    6
1 | A     | 05/11/2020 |    7

我正在寻找基于前三列填充第四列的最佳方法。

【问题讨论】:

  • 请用文字描述你想要的逻辑。从您的数据中看不出来。
  • 除了说明逻辑,请提供数据库标签。

标签: mysql sql gaps-and-islands


【解决方案1】:

你没有很好地解释逻辑。但是您似乎不想计算下一行的“B”和“A”。

这可以表述为以下等式:

  • 行号减
  • 直到该行的 B 数加倍(也得到下一行)
  • 如果该行是 B,则加 1(因为我们刚刚过度减去了下一行)。

这可以实现为:

select t.*,
       (row_number() over (partition by num order by date1) -
        2 * count(*) filter (where value = 'B') over (order by date1) +
        (value = 'B')::int
       )
from t
order by num, date1;

Here 是一个 dbfiddle。

【讨论】:

    【解决方案2】:

    我认为您只想在当前行的值与前一行的值相同时才增加计数器。您可以使用lag() 和累积的sum() 来做到这一点:

    select id, value, date1,
        sum(case when lag_value <> value then 0 else 1 end) as rnk
    from (
        select t.*,
            lag(value) over(order by date1) as lag_value
        from mytable t
    )
    

    【讨论】:

      猜你喜欢
      • 2017-01-17
      • 1970-01-01
      • 2020-04-30
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多