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

How can I set a new column in a table based on the rank of other columns?

我有一个 Microsoft SQL 服务器 table,其中有两列 - 一列用于 Locations,一列用于关联的 Images 。到目前为止,多张 图像可以与同一位置相关联,只有最后 上传的图像在移动网站上实际使用。这是通过为每一行分配一个 ImageRank 来实现的:

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

这样只有 ImageRank = 1 的行才会被处理移动站点的 SSIS 进程选中:

现在我们希望能够选择显示现有张图片(不仅仅是最后一张)。为此,我们引入了第三列 - MobileSelection 位类型。由于此列的引入较晚,因此所有现有行都为 Null。

所以我有这样的东西:

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

我只想将 ImageRank 为 1 的行设置为 1。请记住,ImageRank 不是实际的列,否则这将是微不足道的。

我的目标是能够编写一个更新语句,如果该列所在的行计算出的 ImageRank 为 1,则该语句会将值 1 分配给该列。我 运行 遇到的问题是能够将 Rank Over Partition(或类似的)子句与 Update 语句结合起来:

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

上面returns这个错误:

窗口函数只能出现在 SELECT 或 ORDER BY 子句中。

如有任何帮助,我将不胜感激。谢谢!

使用可更新的 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;

您的要求是为每个位置的最新图像更新 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);