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
我想为每组 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