sql - 如何通过特定顺序检测值的变化

标签 sql sql-server tsql

给定

Id | RouteId | Milepoint | RoadCondition 
-: | :------ | --------: | :------------ 
 1 | A       |         0 | X             
 2 | A       |         1 | X             
 3 | A       |         4 | Y             
 4 | B       |         0 | Y             
 5 | B       |         2 | null 
 6 | B       |         5 | null 
 7 | B       |         6 | Z             
 8 | B       |        18 | Z             
 9 | C       |         0 | X             

我在后面

Id | RouteId | Milepoint | RoadCondition | ContinuousId
-: | :------ | --------: | :------------ | -----------:
 1 | A       |         0 | X             |            1
 2 | A       |         1 | X             |            1
 3 | A       |         4 | Y             |            2
 4 | B       |         0 | Y             |            3
 5 | B       |         2 | null          |            4
 6 | B       |         5 | null          |            5
 7 | B       |         6 | Z             |            6
 8 | B       |        18 | Z             |            6
 9 | C       |         0 | X             |            7
DECLARE @Example TABLE (
  Id INT primary key,
  RouteId varchar(50),
  Milepoint INT,
  RoadCondition varchar(50),
  ContinuousId INT
)

db<> fiddle here

我正在使用 SQL Server 2017。

我所追求的是生成 ContinuousId 的能力,它沿着 RouteId ASC、Milepoint ASC 行进并且当 RouteIdRoadCondition 变化,它增加 ContinuousId

我知道我想使用 LEAD() 但处理 NULL 是我不确定如何解决问题的部分,因为我不能只合并 NULL,因为没有两个可以假定空值是相同的值,只要它看到 RoadCondition 为 NULL,它就应该递增

最佳答案

您可以将 DENSE_RANK()COALESCE() 一起使用:

select e.*,
       dense_rank() over (order by RouteId, coalesce(RoadCondition, cast(id as varchar(255)))) AS New_ContinuousId
from @Example e;

关于sql - 如何通过特定顺序检测值的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54559356/

相关文章:

sql - 只读提交的数据

sql - 如果丢失,PostgreSQL 使用前一行的值

sql - 原则在连接时包含 null

sql-server - SQL - WHERE 子句中的 AND 条件

sql-server - 在字符串中查找多个空格的表达式

sql - 编写 SQL Server 数据库中所有数据的脚本

mysql - sql group by - 诅咒与祝福

mysql - 使用基于动态字段的 DATE_SUB()

mysql - 查询问题从一个表选择结果到另一个表

sql-server - 选择运行总计,直到达到特定的 SUM