Альтернатива оконным функциям в 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

замена «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/Чт, 11 июля, 07:19:59 2013 г.


person mkazma    schedule 28.02.2016    source источник
comment
Ваша первая версия синтаксически неверна, потому что нет order by.   -  person Gordon Linoff    schedule 28.02.2016


Ответы (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;
person Gordon Linoff    schedule 28.02.2016