我的下表有三列:
TB1
userID itemID rating
此表包含有关用户对不同项目的评分的信息。 用户可以对多个项目进行评级,并且项目可以从多个用户接收评级。
我需要更新此表的评级值,以便tb1中的一半应分配5评级,另一半应评为1评级。< / p>
注意:这意味着,虽然用户可以为不同的商品提供不同的评分,但商品的所有评级均为1或所有评级为5。
最初,所有用户和项目对的评级值均为NULL。
可以使用两个单独的查询执行此任务。
UPDATE tb1
SET rating = 5
WHERE itemID IN
(SELECT top(50) percent itemID
FROM tb1
GROUP BY itemID
ORDER BY newid());
UPDATE tb1
SET rating = 1
WHERE rating IS NULL
有没有办法将这些查询合并到一个查询中?
答案 0 :(得分:4)
如果前半部分为1而下半部分为5分,则不表示是否重要。只有50%应该是每个。
如果没关系那么你可以这样做:
UPDATE tb1
SET rating =
(CASE
WHEN itemId <=
(SELECT MAX(itemID)
FROM
(SELECT TOP (50) percent itemID
FROM tb1
GROUP BY itemID
ORDER BY itemID
) x
) THEN 5
ELSE 1
END)
或者,如果您的记录没有任何已删除的项目,或者您并不严格关注50%,那么您可以简单地执行以下操作:
UPDATE tb1
SET rating = CASE
WHEN (itemID % 2) = 1 THEN 1
ELSE 5
END
这种方法的好处是你可以做这样的事情:
UPDATE tb1
SET rating =
CASE (itemID % 5)
WHEN 1 THEN 1
WHEN 2 THEN 7
WHEN 3 THEN 10
WHEN 4 THEN 40
ELSE 5
END