我有一个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子句中。
如果能帮上忙,我将不胜感激。谢谢您!
2条答案
按热度按时间x4shl7ld1#
您的要求是为每个位置的最新图像更新mobileselection=1。
您可以使用下面的sql-
5jdjgkvh2#
使用可更新的cte: