【问题标题】:Row numbering based on contiguous data?基于连续数据的行编号?
【发布时间】:2021-12-03 01:11:34
【问题描述】:

我需要根据日期为行分配数字。规则是将相同的编号分配给具有相同日期的多个连续行。当一行的日期值与前一行的日期值不同时,数字会增加。结果集看起来像这样(第一列将用于确定行顺序):

1     7/1/2021     1
2     7/2/2021     2
3     7/2/2021     2
4     7/1/2021     3
5     7/2/2021     4

在这种情况下,日期的值不相关。正如你所看到的,有相同日期的重复被分配了不同的数值,因为它们不连续。我正在努力弄清楚我将如何做到这一点。

【问题讨论】:

  • 我确实看过,但它产生了错误的结果。 DENSE_RANK() OVER (ORDER BY [TheDate]) 给了我一个 1,2,2,1,2 而不是 1,2,2,3,4 的序列。我错过了什么?
  • 这个问题没有意义。行没有固有的顺序,所以不清楚“连续”是什么意思。投票结束。注意:如果您添加了另一个额外的列作为排序标准,那么这个问题就有意义了。
  • @RussSuter - SQL 集本质上是无序的,如果您希望这 5 行按该顺序出现(并按该顺序排列),您必须ORDER BY 中使用另一列。您是否有任何其他列可以让您强制执行您在问题中使用的顺序?
  • 不,要求我们假设会解决问题。请编辑您的问题并明确添加必要的列以强制执行该排序。您的问题必须是 complete (如“最低限度完整示例”)all 所需资料:meta.stackoverflow.com/questions/366988/what-does-mcve-mean

标签: sql sql-server tsql


【解决方案1】:

这是一个差距和岛屿问题。您需要为查询提供额外的排序列才有意义。

如果您添加了这些,则解决方案将遵循以下原则:

select
  d,
  1 + sum(inc) over(order by ordering_columns) as grp
from (
  select d, ordering_columns,
    case when d <> lag(d) over(order by ordering_columns) then 1 else 0 end as inc
  from t
) x
order by ordering_columns

【讨论】:

  • 优秀。谢谢你。做到了。我快到了。我有内心的疑问,但没有把拼图拼凑在一起。很抱歉一开始措辞不佳的问题。
  • 出于性能原因,您应该始终在运行OVER 计算中使用ROWS UNBOUNDED PRECEDING,否则默认为RANGE。如果ordering_columns 不是唯一的,那么如果你不这样做,你会得到不正确的结果
猜你喜欢
  • 1970-01-01
  • 2021-01-06
  • 2018-01-26
  • 2019-07-05
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多