SQL 创建条件序列

SQL create a conditional sequence

我想为每组 ID 创建一个名为 Sequence 的条件 int 字段。

对于第一次出现的条件,Sequence 的值 1,否则将最后一次计数加 1。字段条件的值列表有限,如图所示下面。

对于一组新的ID,Sequence应该初始化并从1开始计数。

ID Date Condition Seq
01 01Jun14 AAAAAAAAA 1
01 02Jun14 AAAAAAAAA 2
01 03Jun14 BBBBBBBBB 1
01 04Jun14 BBBBBBBBB 2
01 05Jun14 AAAAAAAAA 3
01 06Jun14 BBBBBBBBB 3
01 07Jun14 EEEEEEEEE 1
02 01Jun14 AAAAAAAAA 1
02 02Jun14 CCCCCCCCC 1
02 03Jun14 CCCCCCCCC 2
02 04Jun14 BBBBBBBBB 1
02 05Jun14 AAAAAAAAA 2
02 06Jun14 BBBBBBBBB 2
03 01Jun14 FFFFFFFFF 1
03 02Jun14 AAAAAAAAA 1
03 03Jun14 AAAAAAAAA 2
03 04Jun14 CCCCCCCCC 1

我认为 dense_rank() 应该可以解决问题。

select 
ID,
[Date],
Condition,
dense_RANK() OVER(PARTITION by ID ORDER BY [Date]) as Seq
from Yourtable

正如Squirrel在评论中所指出的,这是行号的作业 基本上

Seq = ROW_NUMBER() OVER (PARTITION BY ID, CONDITION ORDER BY DATE ASC)

如果您需要在插入语句时将其合并到您的代码中,您可以这样做

DECLARE @Seq INT
SELECT @Seq= ROW_NUMBER() OVER (PARTITION BY ID, CONDITION  ORDER BY DATE ASC) FROM <yourtable> WHERE ID=@ID AND CONDITION= @condition 

INSERT INTO <yourtable> VALUES
(@ID, @date, @condition, ISNULL(@Seq,1))

您需要在 row_number 中使用 partition by condition, id,以便每个条件和 ID 组合的 row_number 都从 1 开始。
我创建了一个包含您所需编号的 table,以检查计算出的值是否符合您的需要。

select
  ID,
  d "Date" ,
  Condition,
  Seq seq_required,
  row_number() over (partition by condition, id order by d) seq_calculated
from t
order by id, d
GO
ID | Date       | Condition | seq_required | seq_calculated
-: | :--------- | :-------- | -----------: | -------------:
 1 | 2014-06-01 | AAAAAAAAA |            1 |              1
 1 | 2014-06-02 | AAAAAAAAA |            2 |              2
 1 | 2014-06-03 | BBBBBBBBB |            1 |              1
 1 | 2014-06-04 | BBBBBBBBB |            2 |              2
 1 | 2014-06-05 | AAAAAAAAA |            3 |              3
 1 | 2014-06-06 | BBBBBBBBB |            3 |              3
 1 | 2014-06-07 | EEEEEEEEE |            1 |              1
 2 | 2014-06-01 | AAAAAAAAA |            1 |              1
 2 | 2014-06-02 | CCCCCCCCC |            1 |              1
 2 | 2014-06-03 | CCCCCCCCC |            2 |              2
 2 | 2014-06-04 | BBBBBBBBB |            1 |              1
 2 | 2014-06-05 | AAAAAAAAA |            2 |              2
 2 | 2014-06-06 | BBBBBBBBB |            2 |              2
 3 | 2014-06-01 | FFFFFFFFF |            1 |              1
 3 | 2014-06-02 | AAAAAAAAA |            1 |              1
 3 | 2014-06-03 | AAAAAAAAA |            2 |              2
 3 | 2014-06-04 | CCCCCCCCC |            1 |              1

db<>fiddle here

SELECT ID,Condition,COUNT(con) as seq FROM "your table name" GROUP BY con

SELECT ID,Condition,COUNT(con) as seq FROM "your table name" where ID=1 GROUP BY con

描述:

1- 用于计算 table

中的所有条件类型

2- 统计每组ID中的每种Conditional