我怀疑你正在寻找一个排名功能,或每用户甚至一个简单的COUNT(*)
? MySQL在analytic,ranking或窗口函数中相当差,所以使用诸如奇怪更新或触发器等技巧来模拟它们。
在SQL Server中,你可以返回的单个用户与COUNT()
每一行应用在单个用户相匹配的记录相匹配的记录数:
SELECT *, COUNT(*) OVER (PARTITION BY WATCHLIST_USER)
FROM TF_WATCHLIST_PERSISTENCE
无需触发。您可以使用任何具有OVER()子句的聚合。
如果您想按照某种顺序排列排名,您可以使用ROW_NUMBER()
或RANK()等排名函数之一。如果要计算基于每个用户的一排位置,例如在创建日期,你可以写:
SELECT *, ROW_NUMBER(*) OVER (PARTITION BY WATCHLIST_USER ORDER BY CreationDate)
FROM TF_WATCHLIST_PERSISTENCE
如果你有,你可以用它来生成一个row position
每用户
SELECT *, ROW_NUMBER(*) OVER (PARTITION BY WATCHLIST_USER ORDER BY ID)
FROM TF_WATCHLIST_PERSISTENCE
一个递增的ID大多数时候,你不需要需要存储的行位置。向查询添加排名功能很简单。
如果你需要存储在表中这样的行位置,你可以使用一个简单的多行触发器
CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION
ON TF_WATCHLIST_PERSISTENCE
AFTER INSERT, UPDATE
AS
update TF_WATCHLIST_PERSISTENCE
set WATCHLIST_POSITION =ROW_NUMBER() OVER (PARTITION BY WATCHLIST_USER ORDER BY ID)
FROM inserted
INNER JOIN TF_WATCHLIST_PERSISTENCE on inserted.ID=TF_WATCHLIST_PERSISTENCE.ID
或者
update TF_WATCHLIST_PERSISTENCE
set WATCHLIST_POSITION =ROW_NUMBER() OVER (PARTITION BY WATCHLIST_USER ORDER BY ID)
FROM inserted
INNER JOIN TF_WATCHLIST_PERSISTENCE
ON inserted.WATCHLIST_USER =TF_WATCHLIST_PERSISTENCE.WATCHLIST_USER
如果要插入新的条目现有用户并重新计算所有职位
尝试:'CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION INSERT ON TF_WATCHLIST_PERSISTENCE 之后开始 UPDATE TF_WATCHLIST_PERSISTENCE SET WATCHLIST_POSITION =(SELECT COUNT(*) - 1 FROM TF_WATCHLIST_PERSISTENCE WHERE WATCHLIST_USER = inserted.WATCHLIST_USER) WHERE ROWID =插入.rowid和inserted.WATCHLIST_POSITION为空' – TheGameiswar
谢谢......但我的Management Studio不接受语法。 如果我把它改写这样的,它变得更好: CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION ON TF_WATCHLIST_PERSISTENCE INSERT ON TF_WATCHLIST_PERSISTENCE之后开始UPDATE TF_WATCHLIST_PERSISTENCE SET WATCHLIST_POSITION =(SELECT COUNT(*) - 1 TF_WATCHLIST_PERSISTENCE WHERE WATCHLIST_USER = inserted.WATCHLIST_USER)WHERE ROWID =插入。 rowid并插入。WATCHLIST_POSITION为空 但是,它预计“AS,NOT_FOR,With” –
您使用的是ssms吗? – TheGameiswar