Sybase 中 window 函数的替代方法
Alternative to window functions in Sybase
我有以下查询
SELECT M_PILLAR,
M_MXCOUNTRY,
M_LIMIT_NETEXPOSURE,
M_LIMIT_CURRENCY_NETEXPOSURE,
M_MAXUTILIZATION_NETEXPOSURE,
M_AVAILABLE_NETEXPOSURE,
M_GROUP,
M_ENTITIES,
M_COUNTERPARTIES,
rank() OVER (partition BY M_COUNTERPARTIES,M_PILLAR,M_MAXEXPOSURE_NETEXPOSURE) AS test
FROM X_LP_PSR_REP
但看起来我的 Sybase 数据库不支持 window 函数。
我尝试了以下方法:
SELECT M_PILLAR,
M_MXCOUNTRY,
M_LIMIT_NETEXPOSURE,
M_LIMIT_CURRENCY_NETEXPOSURE,
M_MAXUTILIZATION_NETEXPOSURE,
M_AVAILABLE_NETEXPOSURE,
M_GROUP,
M_ENTITIES,
M_COUNTERPARTIES,
rank() OVER (ORDER BY M_COUNTERPARTIES,M_PILLAR,M_MAXEXPOSURE_NETEXPOSURE) AS test FROM X_LP_PSR_REP
将 "partition by" 替换为 "order by" 也没有用。
请告知如何进行。
我正在使用 Sybase ASE
准确的版本是:
Adaptive Server Enterprise/15.7.0/EBF 21207 SMP SP50 /P/Solaris AMD64/OS 5.10/ase157sp5x/3284/64-bit/FBO/Thu 7 月 11 日 07:19:59 2013
您可以使用相关子查询来执行此操作(尽管效率要低得多)。对于 rank()
(使用使用 ORDER BY
且语法正确的第二个示例),这看起来像:
SELECT r.*,
(SELECT 1 + COUNT(*)
FROM X_LP_PSR_REP r2
WHERE (r2.M_COUNTERPARTIES < r.M_COUNTERPARTIES) OR
(r2.M_COUNTERPARTIES = r.M_COUNTERPARTIES AND r2.M_PILLAR < r.M_PILLAR) OR
(r2.M_COUNTERPARTIES = r.M_COUNTERPARTIES AND r2.M_PILLAR = r.M_PILLAR AND r2.M_MAXEXPOSURE_NETEXPOSURE < r.M_MAXEXPOSURE_NETEXPOSURE)
) as test
FROM X_LP_PSR_REP r;
我有以下查询
SELECT M_PILLAR,
M_MXCOUNTRY,
M_LIMIT_NETEXPOSURE,
M_LIMIT_CURRENCY_NETEXPOSURE,
M_MAXUTILIZATION_NETEXPOSURE,
M_AVAILABLE_NETEXPOSURE,
M_GROUP,
M_ENTITIES,
M_COUNTERPARTIES,
rank() OVER (partition BY M_COUNTERPARTIES,M_PILLAR,M_MAXEXPOSURE_NETEXPOSURE) AS test
FROM X_LP_PSR_REP
但看起来我的 Sybase 数据库不支持 window 函数。
我尝试了以下方法:
SELECT M_PILLAR,
M_MXCOUNTRY,
M_LIMIT_NETEXPOSURE,
M_LIMIT_CURRENCY_NETEXPOSURE,
M_MAXUTILIZATION_NETEXPOSURE,
M_AVAILABLE_NETEXPOSURE,
M_GROUP,
M_ENTITIES,
M_COUNTERPARTIES,
rank() OVER (ORDER BY M_COUNTERPARTIES,M_PILLAR,M_MAXEXPOSURE_NETEXPOSURE) AS test FROM X_LP_PSR_REP
将 "partition by" 替换为 "order by" 也没有用。
请告知如何进行。
我正在使用 Sybase ASE
准确的版本是:
Adaptive Server Enterprise/15.7.0/EBF 21207 SMP SP50 /P/Solaris AMD64/OS 5.10/ase157sp5x/3284/64-bit/FBO/Thu 7 月 11 日 07:19:59 2013
您可以使用相关子查询来执行此操作(尽管效率要低得多)。对于 rank()
(使用使用 ORDER BY
且语法正确的第二个示例),这看起来像:
SELECT r.*,
(SELECT 1 + COUNT(*)
FROM X_LP_PSR_REP r2
WHERE (r2.M_COUNTERPARTIES < r.M_COUNTERPARTIES) OR
(r2.M_COUNTERPARTIES = r.M_COUNTERPARTIES AND r2.M_PILLAR < r.M_PILLAR) OR
(r2.M_COUNTERPARTIES = r.M_COUNTERPARTIES AND r2.M_PILLAR = r.M_PILLAR AND r2.M_MAXEXPOSURE_NETEXPOSURE < r.M_MAXEXPOSURE_NETEXPOSURE)
) as test
FROM X_LP_PSR_REP r;