2016-02-28 5 views
0

У меня есть ниже запрос,Альтернатива оконных функций 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 DB не поддерживает оконные функции.

Я попробовал следующее:

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 

заменить «раздел на» с «порядке» не работает также.

Просьба сообщить, как действовать.

Я использую Sybase ASE

Точная версия:

Adaptive Server Enterprise/15.7.0/ФВГ 21207 SMP SP50/P/Solaris AMD64/OS 5,10/ase157sp5x/3284/64-разрядное/FBO/Thu Jul 11 ​​07:19:59 2013

+0

Ваша первая версия синтаксически неправильно, потому что нет 'порядок by'. –

ответ

1

Вы можете сделать это с помощью коррелированного подзапроса (хотя и гораздо менее эффективно). Для 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;