【问题标题】:SQL - how to count (number) rows every time a value in one column changes?SQL - 每次一列中的值发生变化时如何计算(数量)行?
【发布时间】:2021-10-25 01:38:09
【问题描述】:

我看到有人问过类似的问题,但没有完全类似的问题,我自己也无法弄清楚。在下面的示例表中,前三列已经存在于日历表中,用于引用公司财务日历的复杂性。我将从最早到最晚的日期按 transaction_dt 订购。第 4 列“count_column”是我想要添加的 - 只是一个从 1 开始向上计数的列,每次财政周发生变化。我希望它也忽略每个新日历年的会计周重置为 1 时。我希望 count_column 从 1 开始向上计数并且永远不会重置,只要将新的周数添加到此表中,就继续计数。

有意义吗?我觉得这应该很简单,但我无法破解它。提前致谢。

transaction_dt fiscal_week fiscal_year count_column
2020-12-28 52 2020 1
2020-12-29 52 2020 1
2020-12-30 52 2020 1
2020-12-31 52 2020 1
2021-01-01 52 2020 1
2021-01-02 52 2020 1
2021-01-03 52 2020 1
2021-01-04 01 2021 2
2021-01-05 01 2021 2
2021-01-06 01 2021 2
2021-01-07 01 2021 2
2021-01-08 01 2021 2
2021-01-09 01 2021 2
2021-01-10 01 2021 2
2021-01-11 02 2021 3

【问题讨论】:

  • 请用您正在使用的 DBMS 标记您的问题
  • 一个问题是该列是否是您要在插入时填充的列(我认为这就是您所说的),或者您是否有一个包含三列的表并想要一个能够提供四列,第四列正确计算。如果是前一种方式(可能不是最优雅的触发器是(在伪 plsql 中)select fiscal_week, count_column into max_week, max_count from table order by transaction_date desc fetch first 1 rows only; :new.count_column := case when :new.fiscal_week = max_week then max_count else max_count+1 end;
  • 如果您需要查询,您可以根据财政年 * 52 加上财政周减去一些基值来计算第四列
  • 克里斯 - 我不认为 (year+week)-(min seen year+week) 可以工作,因为如果一周有 0 个交易,它会跳过 count_column 值。跨度>
  • 如果您想将此作为查询,dense_rank() 就是您要查找的内容,here's a fiddle。如果您想将其作为一个专栏,请参阅 Chris 之前的评论。

标签: sql postgresql count rank


【解决方案1】:

你可以使用dense_rank():

select t.*,
       dense_rank() over (order by fiscal_year, fiscal_week) as count_column
from t;

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2022-11-26
    • 2023-03-20
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2013-06-28
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多