2017-09-17 58 views
0

J'utilise Sybase ASE 15.7 qui ne supporte pas RANK() ou toute autre fonction de fenêtrage. J'essaie de calculer les rangs regroupés par catégorie de produit. Considérons le tableau suivant PRODUCTS avec environ 2 millions d'enregistrements.Sybase ASE: Calculer les rangs par catégorie groupée

PROD_CATEGORY | PROD_NAME   | PROD_SALES 
--------------------------------------------- 
Laptops  | Dell Inspiron  | 1000 
Laptops  | Lenovo Thinkpad | 800 
Laptops  | Dell Latitude  | 500 
Laptops  | Acer Aspire  | 1000 
Printers  | Canon Pixma  | 2500 
Printers  | HP OfficeJet  | 800 
Printers  | HP DeskJet   | 1200 
Desktops  | Lenovo ThinkCentre | 900 
Desktops  | Asus Chromebox  | 300 
Desktops  | HP Pavilion  | 1500 

Je suis en train d'écrire une requête SQL qui va calculer les rangs regroupés par catégorie de produit comme ci-dessous:

PROD_CATEGORY | PROD_NAME   | PROD_SALES | SALES_RANK 
------------------------------------------------------------ 
Laptops  | Dell Inspiron  | 1000  | 1 
Laptops  | Lenovo Thinkpad | 800  | 2 
Laptops  | Acer Aspire  | 800  | 2 
Laptops  | Dell Latitude  | 500  | 4 
Printers  | Canon Pixma  | 2500  | 1 
Printers  | HP DeskJet   | 1200  | 2 
Printers  | HP OfficeJet  | 800  | 3 
Desktops  | HP Pavilion  | 1500  | 1 
Desktops  | Lenovo ThinkCentre | 900  | 2 
Desktops  | Asus Chromebox  | 300  | 3 

Notez que les produits ayant la même valeur PROD_SALES génèrent un rang à égalité et la suite les rangs ont un écart en eux.

Pour générer un rang sans la fonction RANK() pour toutes les lignes de la table, la requête SQL standard here fonctionne bien pour la table avec 2 millions de lignes.

Pour générer le rang groupé par catégorie, j'ai essayé la requête SQL donnée here sans succès car la requête prend beaucoup de temps et n'a pas terminé l'exécution.

Existe-t-il un moyen de générer ce classement par catégorie groupée qui fonctionnera avec Sybase ASE?

Cette question est similaire à this SO question qui a été posée pour MySQL.

Répondre

0

Vous pouvez calculer le rang avec une sous-requête corrélative:

select p.*, 
     (select 1 + count(*) 
     from products p2 
     where p2.prod_category = p.prod_category and p2.prod_sales > p.prod_sales 
     ) as rnk 
from products p;