我有一张这样的表格,我会保留一份约会清单,根据A和B的组合增加:
ID A B Appointment Count
-----------------------------
1 abc 0 2010-10-20 1
2 abc 0 2010-10-25 2
3 abc 0 2010-10-30 3
3 abc 1 2010-10-30 1
4 xyz 1 2010-08-18 1
5 xyz 1 2010-08-19 2
6 xyz 1 2010-08-20 3
这样的功能:
CREATE FUNCTION dbo.GenerateCount
(
@id int,
@A int,
@B int,
@appt_date date
)
RETURNS Int
AS
BEGIN
RETURN
(
SELECT COUNT(*)
FROM dbo.test_seq
WHERE patient_id = @A
AND B = @B
AND id <= @id
AND appt_date <= @appt_date
)
END
数据插入如下:
CREATE TABLE [dbo].[test_seq](
[id] [int] IDENTITY(1,1) NOT NULL,
[A] [int] NOT NULL,
[B] [int] NOT NULL,
[appt_date] [date] NOT NULL,
[count] AS dbo.GenerateCount(id, A, B, appt_date)
)
当我在表格中插入新条目时,它会按预期递增计数。但是,如果我插入一个日期在中间的新条目,请说我是否要添加:
ID A B Appointment Count
-----------------------------
1 abc 0 2010-10-21
已分配正确的计数,但其他行未更新。如何在该日期之后触发所有其他记录的表更新,以便使用相关计数值进行更正?
我尝试在插入/更新/删除时创建一个触发器,但这只适用于要插入的行而不是整个表。
答案 0 :(得分:1)
为什么不创建视图
SELECT seq.*
, row_number() over (partition by A, B order by Appointment, ID) as [count]
FROM dbo.test_seq seq
为什么AND id <= @id
?如果你在中间插入一个日期,那就是打破东西。
答案 1 :(得分:1)
如果我说得对,那么简单的答案就是:不要!
SQL-Server-table不是Excel ...
你必须决定
在您的桌子上创建VIEW
(根据方法you find in your last question)。
无论何时调用,都会计算出正确的数字。