【问题标题】:sql server query to assign 2 different column values for each half of rowssql server查询为每半行分配2个不同的列值
【发布时间】:2014-05-12 07:49:35
【问题描述】:

我有以下三列表格:

tb1

userID   itemID   rating

此表包含有关用户对不同项目的评分的信息。 一个用户可以给多个项目评分,一个项目可以从多个用户那里获得评分。

我需要更新此表的评分值,以便 tb1 中的一半项目应该被分配 5 个评分,而另一半应该被分配 1 个评分。

注意:这意味着虽然用户可以对不同的项目给予不同的评分,但一个项目可以将其所有评分设为 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

有没有办法将这两个查询组合成一个查询?

【问题讨论】:

  • 您的itemID 数据类型是??
  • itemid -> smallint 和 rating -> 浮动
  • 您需要详细说明,我对此的理解是:单击某个项目时,该项目的 50% 行将标记为 1,而其他 50% 的行将标记为特定用户 ID 的 5。跨度>
  • 一个用户只能对一个项目进行一次评分。我想要的是一个更新查询,它将 50% 的项目(不是项目的行)的评级修改为 1,将其他 50% 的评级修改为 5。

标签: sql-server divide


【解决方案1】:

如果前半部分是 1,后半部分是 5s,你没有说明是否重要,只是每个应该是 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

【讨论】:

  • 谢谢你的回答。是的,上半场是一秒还是一秒都没有关系。理想情况下,我希望这些项目是随机挑选的,但如果这不可能通过单个查询来完成,那么您的第一个查询将为我完成这项工作。项目列表中缺少 ID,因此第二种方法虽然有用,但在这种特殊情况下不会那么有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多