为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:linux
【CPU】:飞腾 麒麟10
【问题描述】:
sql报错。
SELECT t.,IF(@p=fileId and @u=createUserId,@r:=@r+1,@r:=1) AS rank,@p:=fileId,@u:=createUserId FROM (
SELECT dh.file_id fileId,dh.app_id id,f.file_name fileName,dh.create_user_id createUserId
,dh.create_time operationTime,dh.tenant_id tenantId
,k.title,k.app_id libraryId,'atomic' appCode,k.state,k.publish_date publishDate,k.directory_id directoryId,k.version
FROM IKBASE.sys_download_history dh
join IKBASE.sys_att_file f on dh.file_id = f.id
join IKBASE.app_atomic_main k on k.id = dh.app_id
group by k.id
)t,(SELECT @p:=NULL,@u:=NULL,@r:=0) r
@函数该怎么调整,才能和适配前的查血结果一致
为了将提供的MySQL查询转换为达梦语法,我们需要做几个改变。特别是需要处理变量的初始化和排名逻辑。DM没有直接的变量赋值语法,通常使用PL/SQL块或使用
DENSE_RANK()
或ROW_NUMBER()
窗口函数来实现排名。以下是如何使用DENSE_RANK()
函数将你的查询转换为达梦语法:SELECT t.fileId, t.id, t.fileName, t.createUserId, t.operationTime, t.tenantId, t.title, t.libraryId, t.appCode, t.state, t.publishDate, t.directoryId, t.version, DENSE_RANK() OVER (PARTITION BY t.fileId, t.createUserId ORDER BY t.operationTime) AS rank FROM ( SELECT dh.file_id AS fileId, dh.app_id AS id, f.file_name AS fileName, dh.create_user_id AS createUserId, dh.create_time AS operationTime, dh.tenant_id AS tenantId, k.title, k.app_id AS libraryId, 'atomic' AS appCode, k.state, k.publish_date AS publishDate, k.directory_id AS directoryId, k.version FROM IKBASE.sys_download_history dh JOIN IKBASE.sys_att_file f ON dh.file_id = f.id JOIN IKBASE.app_atomic_main k ON k.id = dh.app_id GROUP BY dh.file_id, dh.app_id, f.file_name, dh.create_user_id, dh.create_time, dh.tenant_id, k.title, k.app_id, k.state, k.publish_date, k.directory_id, k.version ) t;
在这个查询中,
DENSE_RANK()
函数用于为每个fileId
和createUserId
组合分配一个排名,这个排名是根据operationTime
来排序的。我们不再需要初始化变量,因为达梦不支持这种变量赋值语法。注意,我使用了
GROUP BY
子句中列出的所有列。确保在实际的达梦环境中测试这个查询,因为你可能需要根据实际的数据模型和需求进行调整。