如何根据其他列的排名在表中设置新列?

djp7away  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(477)

我有一个microsoftsqlserver表,表中有两列-一列用于位置,一列用于关联的图像。到目前为止,多张图片可以关联到同一个位置,只有最后上传的图片被移动网站上的用户实际使用。这是通过为每行分配一个imagerank来实现的:

RANK() OVER (PARTITION BY Location ORDER BY Image DESC) ImageRank

因此,只有imagerank=1的行被处理移动站点的ssis进程拾取:
现在我们希望能够选择要显示的现有图像(不仅仅是最后一个)。为此,我们引入了第三列—bit类型的mobileselection。由于此列的引入时间较晚,因此它对所有现有行都具有空值。
所以我有这样的想法:

+-------+----------+-----------------+-----------+
| image | location | MobileSelection | ImageRank |
+-------+----------+-----------------+-----------+
|   850 |       10 |         NULL    |         1 |
|   209 |       10 |         NULL    |         2 |
+-------+----------+-----------------+-----------+

我只想将imagerank为1的行设置为1。请记住imagerank不是一个实际的列,否则这将是微不足道的。
我的目标是能够编写一个update语句,如果该列所在的行的计算imagerank为1,则该语句将为该列赋值1。我遇到的问题是如何将rank over partition(或类似的)子句与update语句结合起来:

UPDATE dining_location SET MobileSelection = 1 WHERE RANK() OVER (PARTITION BY Location ORDER BY Image DESC) = 1;

上面返回此错误:
窗口函数只能出现在select或order by子句中。
如果能帮上忙,我将不胜感激。谢谢您!

x4shl7ld

x4shl7ld1#

您的要求是为每个位置的最新图像更新mobileselection=1。
您可以使用下面的sql-

UPDATE dining_location SET MobileSelection = 1 
WHERE image in (select t.image from 
(select location, image, RANK() OVER (PARTITION BY Location ORDER BY Image DESC) as rrank from dining_location) t where t.rrank = 1);
5jdjgkvh

5jdjgkvh2#

使用可更新的cte:

WITH toupdate as (
      SELECT dl.*, RANK() OVER (PARTITION BY Location ORDER BY Image DESC) as seqnum
      FROM dining_location dl
     )
UPDATE toupdate
    SET MobileSelection = 1
    WHERE seqnum = 1;

相关问题