0

我有一个 Microsoft SQL Server 表,其中有两列 - 一列用于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;

以上返回此错误:

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

我将不胜感激。谢谢!

4

2 回答 2

1

使用可更新的 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;
于 2020-07-10T20:17:03.240 回答
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);
于 2020-07-10T20:48:02.833 回答