使用范围组更新列值

时间:2014-03-30 08:53:13

标签: sql database sql-server-2008

我是新的SQL查询我需要帮助。

我有一个表格,其中QuestionId从0到8,但有时除零之外可以重复一个值,我想要的是top从0到8创建一个组,当其他0出现时它将是一个新组,而不是创建我想给SurveyID列提供随机数。

QuestionID  SurveyID
    0         NULL
    1         NULL
    2         NULL
    3         NULL
    4         NULL
    4         NULL
    5         NULL
    6         NULL
    7         NULL
    7         NULL
    8         NULL
    8         NULL
    0         NULL
    1         NULL
    2         NULL
    3         NULL
    4         NULL
    4         NULL
    5         NULL
    6         NULL
    6         NULL
    7         NULL
    8         NULL
    0         NULL
    1         NULL
    2         NULL

我想在第二个0之前从第0个更新组中的surveyID。

我想给组0到8的唯一随机值然后再一个新的随机值为0 - 8

QuestionID  SurveyID
    0         8888
    1         8888
    2         8888
    3         8888
    4         8888
    4         8888
    5         8888
    6         8888
    7         8888
    7         8888
    8         8888
    8         8888
    0         1232
    1         1232
    2         1232
    3         1232

我希望这样做。

1 个答案:

答案 0 :(得分:1)

您可以使用CTE查询以您希望的方式生成SurveyId。我假设您的主键列名为Id,表seq - 请替换它。您也可以使用其他方式生成随机数 - 由您决定。

with cte as
(
    select Id, questionId, convert(int, rand() * Id * 1000) as surverId 
    from seq 
    where questionId = 0

    union all

    select seq.Id, seq.questionId, cte.surverId
    from seq
    inner join cte on cte.Id + 1 = seq.Id
    where seq.questionId <> 0
)

merge seq as target
using (select * from cte) as source (Id, questionId, surveyId)
on (target.Id = source.Id)
when matched then
    update set target.SurveyId = source.surveyId;