根据分组依据、前 1 行和 where case 进行更新

use*_*975 5 sql t-sql greatest-n-per-group

我有一个表如下:
表选择
这是此选择的结果:

SELECT ParentID, ID, [Default], IsOnTop, OrderBy
  FROM [table]
  WHERE ParentID IN (SELECT ParentID
      FROM [table]
      GROUP BY ParentID
      HAVING SUM([Default]) <> 1)
  ORDER BY ParentID
Run Code Online (Sandbox Code Playgroud)

现在,我想要做的是:对于每个ParentID组,将其中一行设置为默认值 ( [Default] = 1),其中使用以下逻辑选择该行:
如果组有一行,IsOnTop = 1则取此行,否则取前 1 行订购OrderBy
我完全不知道如何在 SQL 中执行此操作,并且我有超过 40 个这样的组,因此我想向您寻求帮助,最好对您的查询进行一些解释。

Tim*_*sen 4

只需通过在每个组中分配行号来稍微修改当前查询即可ParentID。行号分配的排序逻辑是IsOnTop值为 1 的记录排在前面,然后由OrderBy列确定位置。我更新 CTE 的条件是只有每组中的第一条记录ParentID被分配Default值 1。

WITH cte AS (
    SELECT ParentID, ID, [Default], IsOnTop, OrderBy,
        ROW_NUMBER() OVER (PARTITION BY ParentID
                           ORDER BY IsOnTop DESC, OrderBy) rn
    FROM [table]
    WHERE ParentID IN (SELECT ParentID FROM [table]
                       GROUP BY ParentID HAVING SUM([Default]) <> 1)
)

UPDATE cte
SET [Default] = 1
WHERE rn = 1;
Run Code Online (Sandbox Code Playgroud)