You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle查询:非数值字段分组与指定格式输出的实现求助

Oracle SQL实现同一用户名仅首行显示的需求

你需要实现同一USRNAM值仅在所属分组的首行显示,其余行该字段为空的效果。当前查询使用GROUP BY的思路不适用,因为这个需求不是聚合统计,而是行级格式化展示,需要用窗口函数实现。

当前查询语句

Select userroles.usrnam,userroles.treeauth,roles.role
from ROLES,USERROLES
WHERE ROLES.TREEAUTH = USERROLES.TREEAUTH AND USRNAM in ('XXXX','YYYY') group by userroles.treeauth,roles.role;

现有表数据

USRNAMTREEAUTHROLE
YYYYMLLab Manager
YYYYTCLab-COA
YYYYBBB&S-Batch
YYYYOROper-Data-DCU
YYYYLIT - LIMS
YYYYADLab Admin
YYYYDTData Users-Tags
YYYYSPLab Special
XXXXHDHelp Desk
YYYYBSB&S
YYYYDCData Users
YYYYTNLab
YYYYBPPlanning-Batch
XXXXLIT - LIMS
YYYYDBB&S-Batch-Data
YYYYDUData Users-COA

期望输出格式

USRNAMTREEAUTHROLE
YYYYMLLab Manager
TCLab-COA
BBB&S-Batch
OROper-Data-DCU
LIT - LIMS
ADLab Admin
DTData Users-Tags
SPLab Special
BSB&S
DCData Users
TNLab
BPPlanning-Batch
DBB&S-Batch-Data
DUData Users-COA
XXXXHDHelp Desk
LIT - LIMS

解决方案

使用Oracle的ROW_NUMBER()窗口函数,按USRNAM分组并为每组内的行编号,再根据编号判断是否显示USRNAM值:

SELECT
    CASE WHEN rn = 1 THEN ur.usrnam ELSE '' END AS USRNAM,
    ur.treeauth,
    r.role
FROM (
    SELECT
        ur.usrnam,
        ur.treeauth,
        r.role,
        ROW_NUMBER() OVER (PARTITION BY ur.usrnam ORDER BY ur.treeauth) AS rn
    FROM ROLES r
    JOIN USERROLES ur ON r.TREEAUTH = ur.TREEAUTH
    WHERE ur.usrnam IN ('XXXX','YYYY')
) t
ORDER BY ur.usrnam DESC, rn;

逻辑说明

  1. 子查询中通过ROW_NUMBER() OVER (PARTITION BY ur.usrnam ORDER BY ur.treeauth)为每个USRNAM分组内的行生成序号,序号从1开始。ORDER BY ur.treeauth保证每组内行顺序一致,可按需修改排序字段。
  2. 外层查询用CASE判断:若为组内第一行(rn=1),显示USRNAM值,否则显示空字符串。
  3. 最终通过ORDER BY确保同一用户的行连续排列,这里用ur.usrnam DESC让YYYY排在前面,和期望输出一致,可按需调整排序规则。

内容的提问来源于stack exchange,提问作者Bala Meenakshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:34:51