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 个这样的组,因此我想向您寻求帮助,最好对您的查询进行一些解释。
只需通过在每个组中分配行号来稍微修改当前查询即可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)
| 归档时间: |
|
| 查看次数: |
3849 次 |
| 最近记录: |