Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在同一列中组合稠密_Rank()和Lag()_Sql_Sql Server_Dense Rank - Fatal编程技术网

Sql 在同一列中组合稠密_Rank()和Lag()

Sql 在同一列中组合稠密_Rank()和Lag(),sql,sql-server,dense-rank,Sql,Sql Server,Dense Rank,我正在根据用户ID、主题ID、项目ID和状态生成尝试编号 不幸的是,函数densite\u rank()没有完全完成我希望它完成的任务;要获得完整的要求,我希望执行以下操作: (1) 使用densite\u rank()创建一个视图,在状态=已启动的位置添加尝试编号。这将忽略其他状态“为NULL” (2) 使用LAG()函数使用以前的尝试次数值更新NULL值 我成功地完成了第(1)步,然而,我正在努力寻找一种干净的方法来完成第(2)步 这是我的代码: CREATE VIEW [StartedRa

我正在根据
用户ID
主题ID
项目ID
状态生成尝试编号

不幸的是,函数
densite\u rank()
没有完全完成我希望它完成的任务;要获得完整的要求,我希望执行以下操作:

(1) 使用
densite\u rank()
创建一个视图,在
状态
=
已启动的位置添加尝试编号。这将忽略其他状态“为
NULL

(2) 使用
LAG()
函数使用以前的尝试次数值更新
NULL

我成功地完成了第(1)步,然而,我正在努力寻找一种干净的方法来完成第(2)步

这是我的代码:

CREATE VIEW [StartedRank] AS
SELECT createdAt, USER_ID, Topic_ID, item_id, [status],
    CASE
        WHEN [status] = 'started' then 
        DENSE_RANK() OVER (PARTITION BY USER_ID, Topic_ID, item_id, [status] order by createdAt) 
        ELSE NULL
    END As AttemptNo
FROM [CurioTest].[dbo].[userprogressesv5]
WHERE type = 'practice' and user_id = '255251'
ORDER by createdAt
这将生成此表:

然后,我尝试使用以下代码更新表:

UPDATE StartedRank
SET AttemptNo = LAG(AttemptNo, 1) OVER (PARTITION BY user_ID, topic_ID, item_id ORDER BY createdAt)
WHERE AttemptNo is null
但SQL不喜欢更新表,因为它包含派生字段

为了测试我的
LAG()
是否确实有效,我使用以下代码对其进行了测试:

SELECT *,
LAG(AttemptNo, 1) over (PARTITION BY user_ID, topic_ID, item_id ORDER BY createdAt) prevAttemptNo
FROM StartedRank
它可以工作,结果截图如下:

如有任何见解,将不胜感激。

请使用如下cte

with cte as
(
SELECT *,
LAG(AttemptNo, 1) over (PARTITION BY user_ID, topic_ID, item_id ORDER BY createdAt) prevAttemptNo
FROM StartedRank
) update cte 
  set AttemptNo=prevAttemptNo
你也可以通过加入来做到这一点

UPDATE A 
set AttemptNo=B.prevAttemptNo
FROM StartedRank A
JOIN (SELECT *,
    LAG(AttemptNo, 1) over (PARTITION BY user_ID, topic_ID, item_id ORDER BY createdAt) prevAttemptNo
    FROM StartedRank) B
    ON A.AttemptNo = B.AttemptNo

嘿-这引发了此错误:
视图或函数“cte”的更新或插入失败,因为它包含派生字段或常量字段。
@OdaySalim是否为sql serber?它是sql Server