如何根据其他列的排名在 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);
我有一个 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);